首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >第一个量词的贪婪是否胜过所有下一个量词的贪婪?

第一个量词的贪婪是否胜过所有下一个量词的贪婪?
EN

Stack Overflow用户
提问于 2015-04-11 20:10:08
回答 1查看 198关注 0票数 2

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

代码语言:javascript
运行
复制
select regexp_matches('aaabbb', 'a+b+?')

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-11 20:27:46

这是我在postgresql 9.4文档中发现的

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

如果RE可以匹配多个子字符串(从该点开始),则根据RE是贪婪的还是非贪婪的,可以选择最长的匹配或最短的可能的匹配。

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

代码语言:javascript
运行
复制
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+?来实现你想要的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29582524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档