首页/开发/正则与编码速查/量词默认贪婪行为及其影响
正则基础45 条

量词默认贪婪行为及其影响

贪婪量词从最长的重复次数开始尝试,失败再逐步回退,结果是当前路径上最靠后的可行方案而非绝对最长。提取结果过长、跨界多数源于贪婪搭配了点号这类宽松字符。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌​‌​‌‌‌​​​‌​‌‌‌​‌​‌​‌‌​​​​‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​​‌‌​​‌‌​‌​​‌​‌‌​​‌​‌​‌‌‌​​‌​​​‌​‌‌​‌​‌‌​​‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌​‌​‌‌​​‌​​​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌​​‌​​​‌‌​​‌​‌​‌‌​​‌‌​​‌‌​​​​‌​‌‌‌​‌​‌​‌‌​‌‌​​​‌‌‌​‌​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

贪婪是怎么实现的

贪婪量词先按最大可能的次数去试,把长度吃满;如果后面接不下去,就退回一步再试,如此往复。所谓贪婪并不是「必然取到最长结果」,而是「在当前尝试路径上从最长的方案开始试」,最终长度取决于后续部分能否成立。

为什么影响结果

当模式里存在成对的分隔符或多处可匹配位置时,贪婪会让引擎选到最靠后的那个终点,于是提取结果包含多个片段。这不是引擎出错,而是模式没把边界写死。

基本信息

默认行为所有量词(星号、加号、问号、花括号)都贪婪
尝试顺序先最多,后逐步减少
结果特征在有多个可匹配终点时倾向取最后一个
改成非贪婪量词后加问号
改成占有量词量词后加加号(PCRE、Java 等支持)或改写为原子组

典型使用场景

  • 提取整行内容时希望连同后续内容一起取到行尾,贪婪正好符合预期
  • 校验收尾分隔符位置,贪婪配合行尾锚点可直接定位到最后一个分隔符之后
  • 拆分结构化文本时,往往需要非贪婪或精确字符类来避免跨段
  • 排查提取结果过长时,先检查是不是贪婪量词吃过了头
  • 在需要严格边界的场景里用非贪婪加断言替代纯贪婪

贪婪与非贪婪对比

贪婪与非贪婪对比
import re
s = '<b>1</b><b>2</b>'
re.search(r'<b>.*</b>', s).group(0)   # 贪婪:一直吃到最后一个闭合标签
re.search(r'<b>.*?</b>', s).group(0)  # 非贪婪:只取第一段
re.search(r'[^<]*', '<b>1')           # 用精确字符类替代点号,边界更可靠
re.search(r'^.*$', 'a\nb', re.M).group(0)  # 行尾锚点前的贪婪只在本行内生效
re.search(r'(?s).*', 'a\nb').group(0)      # 打开跨行后贪婪会吃满全文

三种尝试策略

策略写法失败时的行为
贪婪星号或加号或问号从最长开始逐步回退
非贪婪量词后加问号从最短开始逐步加长
占有量词后加加号(部分引擎)不回退,失败即整体失败
非贪婪并不能替代精确字符类。存在嵌套结构时,非贪婪取到的仍可能不是目标片段;能确定内容边界的,优先写成明确的字符类或断言。
贪婪带来的真正代价是回退次数。模式里同时出现多点号加星号、嵌套重复与不定长度前缀时,回退量会随输入长度急剧增长,极端情况下表现为正则引擎长时间不返回。

易错点

  • 以为贪婪必然取最长结果,遇到回溯失败后取到更短片段时排查方向跑偏
  • 点号加星号紧贴成对标签,提取结果跨越多个结构,下游解析出错
  • 用非贪婪解决所有边界问题,实际仍取到错误片段,应改为精确字符类或断言
  • 无约束的贪婪重复放在行首,遇到超长输入时回退量爆炸,引发超时

数据来源与参考

  • PCRE2 官方文档 pcre2pattern(3):贪婪与非贪婪量词
  • Python 官方文档 re 模块:重复运算符与回退行为
  • Java 官方文档 java.util.regex.Pattern:量词类型说明

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/regex-quantifier-greedy-default.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌​‌​‌‌‌​​​‌​‌‌‌​‌​‌​‌‌​​​​‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​​‌‌​​‌‌​‌​​‌​‌‌​​‌​‌​‌‌‌​​‌​​​‌​‌‌​‌​‌‌​​‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌​‌​‌‌​​‌​​​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌​​‌​​​‌‌​​‌​‌​‌‌​​‌‌​​‌‌​​​​‌​‌‌‌​‌​‌​‌‌​‌‌​​​‌‌‌​‌​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​