【问题标题】:Regex doesnt return macth all group if one regex match group value is inside another match group value? [duplicate]如果一个正则表达式匹配组值在另一个匹配组值内,正则表达式不会返回所有组? [复制]
【发布时间】:2019-07-03 10:24:38
【问题描述】:

正则表达式:

(?<lang2>this\s*is\s*a\s*test\s*string)|(?<lang1>test)

示例文本:

this is a test string

如果您单独运行这些命名的捕获组,则会在具有值的匹配组中产生结果。 但是如果你像上面写的那样运行它,那么它会返回 1 组而不是 2 组。我需要抓住这两个群体。所以输出组应该是这样的:

匹配组 1:“这是一个测试字符串”

匹配组 2:“测试”

【问题讨论】:

  • 因为this is a test string中的test已经被(?&lt;lang2&gt;this\s*is\s*a\s*test\s*string)消费了。你在做什么?请解释。您是否正在尝试构建动态正则表达式并寻找重叠匹配?
  • 是的,即使它被消耗,也可以识别所有字符串。
  • 那么请贴出你代码的相关部分,看看你在做什么。我认为您应该遍历所有可能的模式以查看它们是否匹配。

标签: .net regex


【解决方案1】:

在您的模式中,您使用了一个交替,它将捕获第一个捕获组中的整个字符串,之后交替部分不再匹配。

您可以嵌套捕获组而不是使用交替。

(?<lang2>this\s*is\s*a\s*(?<lang1>test)\s*string)

【讨论】:

  • 我怀疑 OP 可能正在动态构建模式以查找每个备选方案的所有匹配项。这种“嵌套”在这种情况下无济于事。
  • 如果我们不知道单词“test”的位置怎么办
  • @Zeeshan 你到底想完成什么?您可以将代码添加到问题中吗?
  • @WiktorStribiżew 你可能是对的。让我们等待一些澄清。
  • 我正在使用 .Net 库进行正则表达式,并且只使用 Regex.Match 方法,它只返回一个组。我的意思是我可以单独对两个组使用迭代,我已经这样做了,但我希望避免那个循环并只使用 Regex.Match 方法
【解决方案2】:

泽山!

正则表达式引擎总是返回最左边的匹配 理解这一点非常重要:正则表达式引擎总是返回最左边的匹配,即使稍后可以找到“更好”的匹配。将正则表达式应用于字符串时,引擎从字符串的第一个字符开始。它在第一个字符处尝试正则表达式的所有可能排列。只有在尝试了所有可能性并发现失败时,引擎才会继续处理文本中的第二个字符。同样,它以完全相同的顺序尝试所有可能的正则表达式排列。结果是正则表达式引擎返回最左边的匹配。

https://www.regular-expressions.info/engine.html

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多