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

Regex 第一个量词的贪婪性是否覆盖了所有下一个量词的贪婪性?,regex,postgresql,Regex,Postgresql,我正在使用Postgresql 9.4中的模式匹配。我运行以下查询: select regexp_matches('aaabbb', 'a+b+?') 我希望它返回'aaab',但它返回'aaabb'。b+?atom不应该只匹配一个'b',因为它不是贪婪的吗?第一个量词的贪婪度是否设置了整个正则表达式的贪婪度?以下是我在中发现的: 一旦确定了整个匹配的长度,匹配任何特定子表达式的部分将根据该子表达式的greediness属性来确定,子表达式在重新开始时的优先级将高于后面开始的子表达式 及 如果

我正在使用Postgresql 9.4中的模式匹配。我运行以下查询:

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

我希望它返回
'aaab'
,但它返回
'aaabb'
b+?
atom不应该只匹配一个
'b'
,因为它不是贪婪的吗?第一个量词的贪婪度是否设置了整个正则表达式的贪婪度?

以下是我在中发现的:

一旦确定了整个匹配的长度,匹配任何特定子表达式的部分将根据该子表达式的greediness属性来确定,子表达式在重新开始时的优先级将高于后面开始的子表达式

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

这意味着一个操作符的贪婪性是由之前定义的操作符决定的


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

它给出了
aaab
我遗漏了什么吗?可能是postgresql的问题?我在文档中找不到第一句话。你能把它链接起来吗?我想我是从一个pdf中拿出来的,因为我把它的链接弄丢了。。虽然这是谷歌给我的。此外,您还可以阅读答案中引用的文档中的
9.7.3.5
部分,内容涉及如何在psqlA中进行匹配,链接到过时的手册页面(为什么是Postgres 9.0?)是一回事。但完全错误的引用是另一回事。请修复或删除它。更新了引用并修复了报价。。。谢谢:)对不起,我还是不相信这个答案。是的,第一段告诉我,如果我尝试将
'.*.*.
'aaabb'.
匹配,第一个
.*.
将吃掉所有字符,因为它是第一个表达式,尽管它们都是贪婪的。第二段告诉我,根据贪婪,表达式匹配最长的子串或最短,而不是中间的东西。这两条语句都是正确的(不仅对于Postgresql),但它们不能解释为什么非贪婪量词在我已经使用贪婪量词的情况下停止工作。