Regex 的 .NET 实现定义了 '?'字符作为贪婪量词,通知其表达式匹配 0 次或 1 次,并尽可能选择 1 次。
考虑以下源文本:
some text (some parenthetical text)
以及以下正则表达式:
\A(.+)(?:\s\(.+\))?$
结果应该是一个具有以下值的匹配组:
some text
相反,它是整行。现在,当我从正则表达式中删除贪婪的 0 或 1 量词“?”时,我确实得到了预期的结果。但是,由于我的要求预计括号内的文本可能不存在,所以我不能不使用 0 或 1 量词。我如何强制它变得贪婪?
最佳答案
这与您认为的方式不符的原因是因为 (.+)
是贪婪的。
让我解释一下:
(.+)
是贪心的,所以它会立即匹配整个字符串。
(?:\s\(.+\))?
也是贪婪的然而只是因为某些东西是贪婪的它不是意味着它必须匹配(如果没有)。
举个例子:
字符串:abc123
正则表达式:(.+)(\d{3})?
.+
将开始匹配 abc123
。正则表达式引擎将到达下一个字符(空字符)并看到此 (\d{3})?
。现在,正则表达式引擎会尽可能匹配 \d{3}
但它已经匹配了整个字符串。由于 \d{3}
技术上 是可选的,因此可以将其丢弃。
最好的办法是让第一部分变得懒惰,而让最后一部分保持贪婪。
\A(.+)(?:\s\(.+\))?$
会变成 \A(.+?)(?:\s\(. +\))?$
(.+?)
将尝试匹配尽可能少的字符,以便为后半部分留出空间,但如果不需要后半部分,它将消耗字符串的其余部分。
这是 regex101举个例子(我将 \A
更改为 ^
这样多行就可以了)
关于c# - 正则表达式:表现懒惰的贪婪量词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34667940/