Regex.Matches没有捕获我需要的整个组

时间:2015-08-25 21:39:49

标签: 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 /here/]"

我不是特别擅长正则表达式,而是使用regexr.com来验证我的结果。 Regex.Matches与此站点的表达式通常工作复制和粘贴没有问题。这次不是。

使用该命令行字符串的结果如下:

Count = 6
[0]: "-arg1"
[1]: "-arg2"
[2]: "-arg3=500"
[3]: "-arg4=-250,200,50.0"
[4]: "-arg5"
[5]: "-arg6"

这是循环Regex.Matches和每个Captures

我无法弄清楚为什么引号不会成为比赛的一部分。它可能是|(\s+((["']部分的空白问题吗?

1 个答案:

答案 0 :(得分:3)

<强> 更新

I tweaked this per your comment.我将可选空格(\s*)拉入一个空格或等号的非捕获组。您还会看到我在更改中首先移动了引号捕获,因为\S+将开始匹配"foo而我们不希望这样。

(-\w+)(?:=|\s)?("[^"]*"|\S+)?

我对此进行了一些清理,让我知道你写的原始表达是否缺少任何功能:

(-\w+)\s*((?:=\S+)|"[^"]*")?

Demo

有一些事情打破了你的原始表达,包括:

  • 难以阅读,导致使用\2\6引用时出现混淆
  • 没有\d捕获参数键(-[a-zA-Z]+=?
  • 捕获引用值的过于复杂的逻辑