Powershell 拆分中的正则表达式



我需要根据输入将 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作为替换操作数是指正则表达式中第一个捕获组((...))匹配的内容,并且,鉴于正则表达式旨在消耗整个字符串,则仅将其替换为该操作数。

我在偷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

最新更新