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/