【问题标题】:Regex.Matches isn't capturing the whole groups I needRegex.Matches 没有捕获我需要的整个组
【发布时间】:2015-11-19 18:44:44
【问题描述】:
(-[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+((["'] 部分是否存在空格问题?

【问题讨论】:

  • 您忘记添加匹配/捕获所需的内容,输出应该是什么?请注意,正则表达式非常笨拙,需要好好清理。
  • 我没有用 C# 编写过控制台应用程序,但大多数其他语言都有一个库。当然,C# 中有一个不需要正则表达式的库。看看这个线程:stackoverflow.com/q/491595/179311.
  • 遗憾的是,我对使用外部库不感兴趣! :P 但是感谢任何更感兴趣的人。

标签: c# .net regex


【解决方案1】:

更新:

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

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

我总体上对此进行了一些清理,如果您编写的原始表达式中缺少任何功能,请告诉我:

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

Demo


有几件事破坏了你原来的表达方式,包括:

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

【讨论】:

  • 哦哇,该死的好多了!非常感谢。我正在关注另一篇 SO 帖子中引用的值,这肯定要简单得多。我认为原因是内引号,我什至没有预料到。做类似 -arg7="this works too" 之类的事情是否变得更加复杂?在我原来的表达方式中,我无法创建另一个条件,因为我正在点击 \10 引用并且无法使用它,所以我原本打算离开它。
猜你喜欢
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2018-02-19
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
相关资源
最近更新 更多