regex - powershell 拆分中的正则表达式

标签 regex powershell powershell-2.0 powershell-3.0 regex-lookarounds

我需要根据输入将 UNC fqdn 名称剥离为名称或 IP。

我的例子是

\\tom.overflow.corp.com
\\123.43.234.23.overflow.corp.com

我想以 tom123.43.234.23 结束

我的数组中有以下代码,它完美地剥离了域名,但我仍然留下 \\tom

-Split '\.(?!\d)')[0]

最佳答案

您的正则表达式原则上成功地分离了感兴趣的标记,但它没有考虑输入字符串中的前导 \\

您可以使用正则表达式交替 (|) 在开头包含前导 \\ 作为 附加 -split 分隔符.

鉴于在输入的最开始匹配分隔符会创建一个索引为 0 元素,然后您需要访问索引 1 获取感兴趣的子串。

简而言之:传递给 -split 的正则表达式应该是 '^\\\\|\.(?!\d)' 而不是 '\.(?!\d)',并且用于访问结果数组的索引应该是 [1] 而不是 [0]:

'\\tom.overflow.corp.com', '\\123.43.234.23.overflow.corp.com' | 
  ForEach-Object { ($_ -Split '^\\\\|\.(?!\d)')[1] }

以上结果:

tom
123.43.234.23

或者,您可以在单独的步骤中删除前导\\,使用-replace:

'\\tom.overflow.corp.com', '\\123.43.234.23.overflow.corp.com' | 
  ForEach-Object { ($_ -Split '\.(?!\d)')[0] -replace '^\\\\' }

然而,另一种选择是使用单个-replace操作,它不需要ForEach-Object 调用(不需要显式迭代):

'\\tom.overflow.corp.com', '\\123.43.234.23.overflow.corp.com' -replace
  '?(x) ^\\\\ (.+?) \.\D .+', '$1'
  • 内联选项 (?x) (IgnoreWhiteSpace) 允许您使用无关紧要的空格使正则表达式更具可读性:任何未转义的空格可用于视觉格式化。

  • ^\\\\ 匹配开头的 \\(用 \ 转义)(^) 每个字符串。

  • (.+?) 延迟匹配一个或多个字符。

  • \.\D 匹配文字 . 后跟数字其他的内容 (\d 匹配一个数字,\D 是它的否定)。

  • .+ 匹配一个或多个剩余字符,即输入的其余部分。

  • $1 作为替换操作数指的是正则表达式中第一个捕获组 ((...)) 匹配的内容,并且假设正则表达式旨在消耗整个字符串,仅用它替换它。

关于regex - powershell 拆分中的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53508163/

相关文章:

Java 使用正则表达式拆分空间?

javascript - 正则表达式 - 匹配 0 次或 1 次

azure - 在 Azure 自动化中使用 Powershell 从 Azure 文件共享读取文件时清空文件输出

azure - 用于禁用 Azure 数据工厂的网络设置的 Power shell 命令

powershell - 导出到excel的脚本

forms - 在不使用 'Invoke-WebRequest' 的情况下发布 HTTP 表单

javascript - 用于匹配名字后跟没有空格的正则表达式

regex - 如何快速查找大字符串中的子字符串及其周围字符?

powershell - 在Powershell 5.0类中使用自定义类型

powershell - 当我已经定义了变量时出现意外的 token 错误