可选的正则表达式捕获组 - 我缺少什么?

时间:2016-06-03 18:10:29

标签: regex powershell

这是我测试的代码

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}}

任何帮助将不胜感激

这是我测试的地方

https://regex101.com/r/cP9wF2/1

1 个答案:

答案 0 :(得分:4)

((?:\d{1,3}\.){3}\d{1,3}(?:-\d+)?)(?:.*?((?:IR |INC)\d+))?

Regular expression visualization

Debuggex Demo

.*?上的非贪婪修饰符会在匹配我认为的空间时立即停止匹配,假设之后没有匹配。

相反,我们将整个第二部分从.*?通过最后的可选捕获组,在非捕获组中,并使 可选,而在其中, (先前可选的)捕获组是强制性的。