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/

10-12 18:27