我正在使用Postgresql 9.4中的模式匹配。我运行以下查询:
select regexp_matches('aaabbb', 'a+b+?')我希望它返回'aaab',但是它返回'aaabbb'。b+?原子不应该只匹配一个'b',因为它不贪婪吗?第一个量词的贪婪是否为整个正则表达式设置了贪婪?
发布于 2015-04-11 20:27:46
这是我在postgresql 9.4文档中发现的
一旦确定了整个匹配的长度,匹配任何特定子表达式的部分将根据该子表达式的贪婪属性确定,在RE中较早开始的子表达式优先于稍后开始的子表达式。
和
如果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+?来实现你想要的。
https://stackoverflow.com/questions/29582524
复制相似问题