Powershell Regex - 可选的命名组匹配

时间:2011-12-20 23:28:49

标签: regex powershell optional

假设我有一个字符串:

$string1 = "Hello_World:How, are, you:-all -is -well"

我想使用正则表达式将冒号分隔的字符串部分匹配到命名组中。例如:

$pattern = "(?<first>.*)\:(?<second>.*)\:(?<third>.*)"

这个$模式会成功匹配$ string1,我最终会得到以下匹配:

first=Hello_World
second=How, are, you
third=-all -is -well

这很好,但有一个问题。 $ string1可能缺少第三部分,例如:

$string1 = "Hello_World:How, are, you"

不幸的是,这个$ string1不再匹配正则表达式模式。如何使模式匹配两种格式的字符串? (即我应该总是进行“第一次”和“第二次”比赛,如果提供则只有“第三次”比赛。)

2 个答案:

答案 0 :(得分:6)

使用?量词和非捕获组。另外,请勿使用.*

(?<first>[^:]*):(?<second>[^:]*)(?::(?<third>.*))?

另外,你应该至少在开始时锚定你的正则表达式。

答案 1 :(得分:2)

@ fge的答案应该有效,但如果这就是你要做的,我建议你使用String.Split来获得你需要的东西:

$split = $string1.split(':')
if(($split.count -eq 2) -or ($split.count -eq 3)){
    #use $split[0] etc.
}