第一个量词的贪婪是否会覆盖所有下一个量词的贪婪?

时间:2015-04-11 20:10:09

标签: regex postgresql

我在Postgresql 9.4中使用模式匹配。我运行这个查询:

select regexp_matches('aaabbb', 'a+b+?')

我希望它返回'aaab',但它会返回'aaabbb'b+?原子不应只匹配一个'b'因为它不贪心吗?第一个量词的贪婪是否设定了整个正则表达式的贪婪程度?

1 个答案:

答案 0 :(得分:3)

以下是我在postgresql 9.4's documentation中找到的内容:

  

一旦确定了整个匹配的长度,就根据该子表达式的贪婪属性确定匹配任何特定子表达式的部分,其中RE中较早的子表达式优先于稍后开始的子表达式。 / p>

  

如果RE可以匹配从该点开始的多个子字符串,则将采用最长匹配或最短匹配,具体取决于RE是贪婪还是非贪婪。

这意味着什么的一个例子:

SELECT SUBSTRING('XY1234Z', 'Y*([0-9]{1,3})');
Result: 123
SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
Result: 1

在第一种情况下,RE作为一个整体是贪婪的,因为Y*是贪婪的。它可以从Y开始匹配,并且匹配从那里开始的最长的字符串,即Y123。输出是其中括号内的部分,或123。在第二种情况下,RE作为一个整体是非贪婪的,因为Y*?是非贪婪的。它可以从Y开头匹配,并且匹配从那里开始的最短可能的字符串,即Y1。子表达式[0-9]{1,3}是贪婪的,但它不能改变关于总体匹配长度的决定;所以它被迫只匹配1。

意味着操作符的贪婪程度取决于之前定义的操作符。

我猜你必须使用a+?b+?来实现你想要的目标。