c# - 正则表达式:表现懒惰的贪婪量词

标签 c# regex

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/

相关文章:

c# - 下拉菜单填充另一个 c# mvc json ajax

c# - 为什么不能将两个泛型类型与 '==' 进行比较?

sql - 进行 psql 导出(使用正则表达式替换所有列)的最佳方法是什么?

javascript - JS 字符串中的行尾(也称为换行符)

Python 解析器 ply 匹配错误的正则表达式

javascript - 如何在不替换标签本身的情况下替换html标签之间的内容

c# - 泛型约束有什么用?例如 : where T : IComparable

c# - 在 C# 中使用 Moq 模拟服务

c# - NHibernate DuplicateMappingException 当两个类具有相同的名称但不同的命名空间时

java - 如何正确转义推文以将其作为 JSON 发送到 socket.io?