C# Regex.Matches不是';我无法捕获我需要的所有组
我有一大堆命令行参数C# Regex.Matches不是';我无法捕获我需要的所有组,c#,.net,regex,C#,.net,Regex,我有一大堆命令行参数 (-[a-zA-Z]+=?)+(([^\s]+)|(\s+((["'])(?:(?=(\\?))\2.)*?\6))) 我对正则表达式不是特别在行,我用它来验证我的结果。与此站点中的表达式匹配的正则表达式通常可以复制和粘贴,没有问题。这次不是 使用该命令行字符串的结果如下: -arg1 -arg2 -arg3=500 -arg4=-250,200,50.0 -arg5 "Hello World" -arg6 "[I don't know whats going on /h
(-[a-zA-Z]+=?)+(([^\s]+)|(\s+((["'])(?:(?=(\\?))\2.)*?\6)))
我对正则表达式不是特别在行,我用它来验证我的结果。与此站点中的表达式匹配的正则表达式通常可以复制和粘贴,没有问题。这次不是
使用该命令行字符串的结果如下:
-arg1 -arg2 -arg3=500 -arg4=-250,200,50.0 -arg5 "Hello World" -arg6 "[I don't know whats going on /here/]"
这是通过Regex.Matches循环的,每个
我不明白为什么这些引语不会成为比赛的一部分。这可能是|(\s+([“')]
部分的空白问题吗?更新:
我将可选空格(\s*
)拉入一个带有空格或等号的非捕获组。您还会看到我在替换中首先移动了引号捕获,因为\s+
将开始匹配“foo
,我们不希望这样
Count = 6
[0]: "-arg1"
[1]: "-arg2"
[2]: "-arg3=500"
[3]: "-arg4=-250,200,50.0"
[4]: "-arg5"
[5]: "-arg6"
我大体上清理了一下,如果您编写的原始表达式中缺少任何功能,请告诉我:
(-\w+)(?:=|\s)?("[^"]*"|\S+)?
有两件事打破了你原来的表达方式,包括:
- 非常难阅读,这会导致在使用
或\2
引用时出现混乱\6
- 没有参数键的捕获(
)-[a-zA-Z]+=?
- 通过复杂的逻辑捕获引用值
(-\w+)\s*((?:=\S+)|"[^"]*")?