我需要根据输入将 UNC fqdn 名称剥离为名称或 IP。
我的例子是
\\tom.overflow.corp.com
\\123.43.234.23.overflow.corp.com
我想以 tom
或 123.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/