正则表达式系列——贪婪与非贪婪模式
前言
本文属于 正则表达式系列文章之一,更多请前往 正则表达式系列
贪婪模式和非贪婪模式是正则匹配中的重要特性 在理解贪婪和非贪婪的区别时,可以根据实例,一步一步的循序渐进
大纲
-
匹配规则简介
-
贪婪模式与非贪婪模式快速理解
-
实例练习
-
回溯现象与匹配失败
匹配规则简介
var str='aabcab';
var reg=/ab/;
var res=str.match(reg);
// ab index 为 1
console.log(res);
要快速理解正则的匹配规则,可以先尝试理解上述的例子
匹配步骤是这样的:
-
初始
index=0
,匹配到了字符a
-
接下来匹配下一个字符
a
,但是由于aa
和/ab/
不匹配,因此此次匹配失败 -
index
挪到下一个,从1
开始,又重新匹配了a
-
接下来匹配下一个字符
b
,刚好和/ab/
匹配,因此此次匹配成功,返回了ab
,index=1
-
如果正则的匹配后面有
g
这种关键字,则会继续开始下一组的匹配(但是本例中没有g
,因此只有一组结果)
要点
- 最先开始的匹配拥有最高的优先权
这一个要点的详细解释是: 例如第一个匹配的字符是a
,假设之后的匹配没有出现匹配失败的情况。则它将一直匹配下去,直到匹配完成,也就是说index=0
不会变,直到匹配完成(如果出现匹配失败并且无法回溯,index
才会继续往下挪)
这一点适用于下面的贪婪模式与非贪婪模式中(并且优先级高于它们),因此请谨记
贪婪模式与非贪婪模式快速理解
贪婪匹配模式
定义
正则表达式去匹配时,会尽量多的匹配符合条件的内容
标识符
+
,?
,*
,{n}
,{n,}
,{n,m}
匹配时,如果遇到上述标识符,代表是贪婪匹配,会尽可能多的去匹配内容
示例
var str='aacbacbc';
var reg=/a.*b/;
var res=str.match(reg);
// aacbacb index为0
console.log(res);
上例中,匹配到第一个a
后,开始匹配.*
,由于是贪婪模式,它会一直往后匹配,直到最后一个满足条件的b
为止,因此匹配结果是aacbacb
示例2
var str='aacbacbc';
var reg=/ac.*b/;
var res=str.match(reg);
// acbacb index为1
console.log(res);
第一个匹配的是a
,然后再匹配下一个字符a
时,和正则不匹配,因此匹配失败,index
挪到1
,接下来匹配成功了ac
,继续往下匹配,由于是贪婪模式,尽可能多的去匹配结果,直到最后一个符合要求的b
为止,因此匹配结果是acbacb
非贪婪匹配模式
定义