我需要根据输入将 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
作为替换操作数是指正则表达式中第一个捕获组((...)
)匹配的内容,并且,鉴于正则表达式旨在消耗整个字符串,则仅将其替换为该操作数。
我在偷Lee_Daileys$InSTuff
但附加了我最近使用的正则表达式
$InStuff = -split @'
\tom.overflow.corp.com
\123.43.234.23.overflow.corp.com
'@
$InStuff |ForEach-Object {($_.Trim('\') -split '.(?!d{1,3}(.|$))')[0]}
示例输出:
tom
123.43.234.23
正如您在 RegEx101 上看到的,数字之间的点不匹配
Select-String 函数使用正则表达式并使用匹配项填充MatchInfo
对象(然后可以查询)。
正则表达式"(.?d+)+|w+"
适用于您的特定示例。
"\tom.overflow.corp.com", "\123.43.234.23.overflow.corp.com" |
Select-String "(.?d+)+|w+" | % { $_.Matches.Value }
虽然这不是正则表达式,但它确实有效。[GRIN] 我怀疑如果你有大量这样的项目,那么你会想要一个正则表达式。它们确实比简单的文本运算符更快。
这将删除前导\
,然后将域名替换为 .
# fake reading in a text file
# in real life, use Get-Content
$InStuff = -split @'
\tom.overflow.corp.com
\123.43.234.23.overflow.corp.com
'@
$DomainName = '.overflow.corp.com'
$InStuff.ForEach({
$_.TrimStart('\').Replace($DomainName, '')
})
输出。。。
tom
123.43.234.23