Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell Regex-可选的命名组匹配_Regex_Powershell_Optional - Fatal编程技术网

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,呵呵。