如果一个正则表达式匹配组值在另一个匹配组值内,则正则表达式不返回所有组吗?

时间:2019-07-03 10:24:38

标签: .net regex

正则表达式:

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

示例文字:

this is a test string

如果分别运行那些命名的捕获组,则结果将与值匹配。 但是,如果您像上面写的那样运行它的组合,那么它将返回1组而不是2组。我需要捕获两个组。因此,输出组应为:

  

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

     

匹配的组2:“测试”

2 个答案:

答案 0 :(得分:1)

在您的模式中,您使用了一种交替方式,它将在第一个捕获组中捕获整个字符串,此后,再也没有匹配的交替部分了。

您可以嵌套捕获组,而不必使用轮换。

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

答案 1 :(得分:0)

Zeeshan!

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

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