这是我测试的代码
Line IP Number
---- -- ------
1 1.1.1.1
2 2.2.2.2
给了我这个,我不知道为什么第二行没有数字
?
当然,如果我通过删除最后的$counter = 0
@'
1.1.1.1 (IMGTBCCWPRTIE34)
2.2.2.2 (CMRI58672304 INC02394875 - fj)
'@.Split("`n") | % {
$counter++
if ($_ -match '((?:\d{1,3}\.){3}\d{1,3}(?:-\d+)?).*?((?:IR |INC)\d+)') {
[pscustomobject]@{
Line = $counter
IP = $Matches[1]
Number = $Matches[2]
}
}
}
来强制使用最后一部分,那么非匹配的行就不会捕获任何内容
Line IP Number
---- -- ------
2 2.2.2.2 INC02394875
给了我这个
$counter = 0
@'
1.1.1.1 (IMGTBCCWPRTIE34)
2.2.2.2 (CMRI58672304 INC02394875 - fj)
'@.Split("`n") | % {
$counter++
if ($_ -match '((?:\d{1,3}\.){3}\d{1,3}(?:-\d+)?)') {
$ip = $Matches[1].Trim()
if ($_ -match '((?:IR |INC)\d+)') {
$number = $Matches[1].Trim()
} else {
$number = $null
}
[pscustomobject]@{
Line = $counter
IP = $ip
Number = $number
}
}
}
这样可行,但像正则表达式一样只是一行
Line IP Number
---- -- ------
1 1.1.1.1
2 2.2.2.2 INC02394875
它给了我想要的结果,但是我不知道怎么只用一个正则表达式来到这里。
{{1}}
任何帮助将不胜感激
这是我测试的地方
答案 0 :(得分:4)
((?:\d{1,3}\.){3}\d{1,3}(?:-\d+)?)(?:.*?((?:IR |INC)\d+))?
.*?
上的非贪婪修饰符会在匹配我认为的空间时立即停止匹配,假设之后没有匹配。
相反,我们将整个第二部分从.*?
通过最后的可选捕获组,在非捕获组中,并使 可选,而在其中, (先前可选的)捕获组是强制性的。