正则表达式:贪婪量词表现懒惰

时间:2016-01-08 01:05:40

标签: c# regex

正则表达式的.NET实现定义了'?'字符作为贪婪量词,通知其表达式匹配0或1次,如果可能则更喜欢1。

考虑以下源文本:

some text (some parenthetical text)

以下正则表达式:

\A(.+)(?:\s\(.+\))?$

结果应该是一个匹配的组,其值为:

some text

相反,它是整条线。现在当我从正则表达式中删除贪婪的0或1量词'?'时,我确实得到了预期的结果。但是,由于我的要求可能不存在括号内的文本,因此我不能将0或1个量词关闭。我如何强迫它贪婪?

1 个答案:

答案 0 :(得分:3)

这与你认为的方式不匹配的原因是因为(.+)贪婪。

让我解释一下:

(.+)贪婪,所以它会立即匹配整个字符串。

(?:\s\(.+\))?也贪婪然而只是因为某些东西贪婪它并不代表它匹配如果它也没有。

举个例子:

字符串abc123

正则表达式(.+)(\d{3})?

.+将开始匹配abc123。正则表达式引擎将转到下一个字符(这是一个空字符)并查看此(\d{3})?。现在,如果可能的话,正则表达式引擎更愿意匹配\d{3},但它已匹配整个字符串。由于\d{3} 技术上是可选的,因此可以将其丢弃。

你最好的选择是让第一部分变得懒惰并保持最后一节贪婪。

\A(.+)(?:\s\(.+\))?$将成为\A(.+?)(?:\s\(.+\))?$

(.+?)将尝试匹配尽可能少的字符,以便为下半部分留出空间,但如果不需要下半部分,它将消耗其余字符串。

此处有regex101个示例(我将\A更改为^,因此多行可行)