假设我有一个字符串:
$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不再匹配正则表达式模式。如何使模式匹配两种格式的字符串? (即我应该总是进行“第一次”和“第二次”比赛,如果提供则只有“第三次”比赛。)
答案 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.
}