# 课程 A4:贪婪 vs 懒惰
当正则表达式中包含 *
、+
、?
等表示重复的元字符时,默认会匹配尽可能多的字符,这被称为贪婪匹配。例如给定字符串 abcab
,模式 a.*b
会匹配最长的以 a
开始、以 b
结束的字符串,也就是匹配到整个字符串而不是 ab
。
与贪婪匹配相反的是非贪婪匹配,或者称为懒惰匹配,也就是匹配尽可能少的字符。语法是在上述元字符后面加上一个问号 ?
。在上面的例子中,模式 a.*?b
将匹配到 ab
。
所有表示重复的元字符都可以转化为懒惰匹配模式:
*?
:重复任意次,但尽可能少重复+?
:重复 1 次或更多次,但尽可能少重复??
:重复 0 次或 1 次,但尽可能少重复{n,m}?
:重复 n 到 m 次,但尽可能少重复{n,}?
:重复 n 次或更多次,但尽可能少重复
在下面的练习中,请尝试修改模式 (\d+)0*$
,使其捕获不包含 0
的数字前缀。
练习 A4:懒惰匹配
Task | Text | Capture Groups | Result |
capture | 123000 | 123 | |
capture | 1010 | 101 | |
capture | 789 | 789 |
解决上述任务以继续下一个问题,或者查看答案。