8

假设我有一个字符串:

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

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

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

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

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

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

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

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

4

2 回答 2

7

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

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

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

于 2011-12-20T23:35:58.793 回答
2

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

$split = $string1.split(':')
if(($split.count -eq 2) -or ($split.count -eq 3)){
    #use $split[0] etc.
}
于 2011-12-20T23:42:55.897 回答