Powershell Regex-可选的命名组匹配
假设我有一个字符串:Powershell Regex-可选的命名组匹配,regex,powershell,optional,Regex,Powershell,Optional,假设我有一个字符串: $string1 = "Hello_World:How, are, you:-all -is -well" 我想使用一个正则表达式来匹配由冒号分隔成命名组的字符串部分。例如: $pattern = "(?<first>.*)\:(?<second>.*)\:(?<third>.*)" $string1 = "Hello_World:How, are, you" 这很好,但有一个问题。$string1可能缺少第三部分,例如: $pat
$string1 = "Hello_World:How, are, you:-all -is -well"
我想使用一个正则表达式来匹配由冒号分隔成命名组的字符串部分。例如:
$pattern = "(?<first>.*)\:(?<second>.*)\:(?<third>.*)"
$string1 = "Hello_World:How, are, you"
这很好,但有一个问题。$string1可能缺少第三部分,例如:
$pattern = "(?<first>.*)\:(?<second>.*)\:(?<third>.*)"
$string1 = "Hello_World:How, are, you"
不幸的是,这个$string1不再匹配正则表达式模式。如何使模式与字符串的两种格式匹配?(也就是说,我应该总是有一个“第一”和“第二”匹配,并且只有一个“第三”匹配(如果提供)。使用
?
量词和非捕获组。另外,不要使用*
(?<first>[^:]*):(?<second>[^:]*)(?::(?<third>.*))?
(?[^:]*):(?[^:]*)(?::(?*))?
此外,您应该至少在开始时锚定正则表达式。@fge的答案应该有效,但如果这就是您要做的全部,我建议您使用String.Split来获取所需的内容:
$split = $string1.split(':')
if(($split.count -eq 2) -or ($split.count -eq 3)){
#use $split[0] etc.
}
是的,那更简单。但是,只要OP确认不同的部分不包含
:
——我的解决方案也不能正确处理这个问题,我就不愿意给它+1,呵呵。