我在Postgresql 9.4中使用模式匹配。我运行这个查询:
select regexp_matches('aaabbb', 'a+b+?')
我希望它返回'aaab'
,但它会返回'aaabbb'
。 b+?
原子不应只匹配一个'b'
因为它不贪心吗?第一个量词的贪婪是否设定了整个正则表达式的贪婪程度?
答案 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+?
来实现你想要的目标。