贪婪匹配是正则表达式默认行为,指*、+、?、{n,m}等限定符尽可能多地向后匹配字符,先吞尽再回退验证,而非单纯找最长子串。
正则表达式中“重复次数最多”的匹配策略,本质是贪婪匹配(greedy matching)——这是绝大多数正则引擎的默认行为。
什么是贪婪匹配?
当使用 *、+、{n,} 等限定符时,引擎会尽可能多地向后匹配字符,只要整体模式还能成立。它不是“找最长”,而是“先吞最多,再回退验证”。
-
a.*b在字符串axxxb123b中匹配到axxxb123b(而非更短的axxxb),因为.*先吃掉全部,再逐步释放末尾字符直到遇到最后一个b -
\d+匹配12345时,不会停在1或12,而是吞下整个数字串
哪些限定符默认贪婪?
所有基础重复限定符都默认贪婪:
-
*→ 匹配 0 次或更多,尽可能多 -
+→ 匹配 1 次或更多,尽可能多 -
?→ 匹配 0 或 1 次,优先尝试 1 次(即“有就取”) -
{n,m}、{n,}、{n}→ 均按上限或无限延伸方向贪婪执行
如何控制“最多”变成“最少”?
在任意贪婪限定符后加 ?(问号),即可切换为惰性(非贪婪)模式:
-
.*?:匹配任意字符,但只取满足后续条件的最短可能 -
\d+?:匹配数字,但一旦够用就停(例如在123abc中匹配1而非123) -
a{2,5}?:优先尝试匹配 2 次,而不是 5 次
实际影响:为什么“最多”有时反而出错?
贪婪容易导致过度捕获,尤其在含多个目标的文本中:
- 想提取 HTML 标签内容:
<div>hello</div> <div>world</div> - 错误写法:
<div>.*</div>→ 会匹配整个字符串(从第一个<div> 到最后一个 <code>











