贪婪匹配模式
定义
正则表达式去匹配时,会尽量多的匹配符合条件的内容
标识符
+
,?
,*
,{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
非贪婪匹配模式
定义
正则表达式去匹配时,会尽量少的匹配符合条件的内容 也就是说,一旦发现匹配符合要求,立马就匹配成功,而不会继续匹配下去(除非有g
,开启下一组匹配)
标识符
+?
,??
,*?
,{n}?
,{n,}?
,{n,m}?
可以看到,非贪婪模式的标识符很有规律,就是贪婪模式的标识符后面加上一个?
示例
var str='aacbacbc';
var reg=/a.*?b/;
var res=str.match(reg);
// aacb index为0
console.log(res);
上例中,匹配到第一个a
后,开始匹配.*?
,由于是非贪婪模式,它在匹配到了第一个b
后,就匹配成功了,因此匹配结果是aacb
为什么是aacb
而不是acb
呢? 因为前面有提到过一个正在匹配的优先规则: 最先开始的匹配拥有最高的优先权 第一个a
匹配到了,只要之后没有发生匹配失败的情况,它就会一直匹配下去,直到匹配成功
示例2
var str='aacbacbc';
var reg=/ac.*?b/;
var res=str.match(reg);
// acb index为1
console.log(res);
先匹配的a
,接下来匹配第二个a
时,匹配失败了index
变为1
,继续匹配ac
成功,继续匹配b
,由于是非贪婪模式,此时acb
已经满足了正则的最低要求了,因此匹配成功,结果为acb
示例3
var str='aacbacbc';
var reg=/a.*?/;
var res=str.match(reg);
// a index为0
console.log(res);
var reg2=/a.*/;
var res2=str.match(reg2);
// aacbacbc index为0
console.log(res2);
这一个例子则是对示例1的补充,可以发现,当后面没有b
时,由于是非贪婪模式,匹配到第一个a
就直接匹配成功了 而后面一个贪婪模式的匹配则是会匹配所有