js正则中的贪婪匹配和非贪婪匹配
2017-04-25 23:19

js正则中的贪婪匹配和非贪婪匹配

javascript的匹配模式有两种,一种是贪婪匹配,一种是非贪婪匹配。它们的表现形式的区别就在于一个"?"问号。

贪婪匹配,会尽量多的匹配,也是js正则中的默认匹配方式。

非贪婪匹配,会尽量少的匹配,这需要多加一个“?”问号来启动。

var str="现在是22点钟,40分";
var reg=/\d+/g;
var rst;
while((rst=reg.exec(str))!=null){
    console.log(rst);
}

这段代码是默认的贪婪匹配模式,它会匹配22和40,匹配结果如下:

blob.png

而如果我们对这个正则改成非贪婪匹配模式的话,匹配结果就大相径庭了。

var str="现在是22点钟,40分";
var reg=/\d+?/g;
var rst;
while((rst=reg.exec(str))!=null){
    console.log(rst);
}

注意,我们只是在"\d+"后面多加了一个“?”号,它就变成了非贪婪匹配了。

而他的匹配结果是2,2,4,0:

blob.png

多加一个问号,启动非贪婪匹配后,正则的匹配会变成取最小的可能,“\d+”表示1到多个数字。那么非贪婪匹配就会取1个数字。

同样,利用非贪婪匹配的特性,我们可以制造出一个死循环来:

var str="现在是22点钟,40分";
var reg=/\d??/g;
var rst;
while((rst=reg.exec(str))!=null){
    console.log(rst);
}

这里“\d??”中的第一个“?”表示数字是0到1个,第二个"?"表示开启非贪婪匹配模式,那么这个正则就会匹配最小的0个数字,那就是匹配空了,而匹配空就会导致死循环,冒着电脑死机的风险,把死循环的正则给截图了一下:

blob.png

那么知道这个正则会导致死循环了,我们再分析一下它会导致死循环的原理。这个非贪婪匹配的正则匹配的是空,那么空字符也是符合匹配的结果的,匹配到空字符了,因为它不占字符长度,所以index+0还是index,index没有变化,就一直在循环匹配空字符,最终导致死循环的结果。

贪婪匹配我们常用,非贪婪匹配我们使用的频率不是很高。非贪婪匹配就是在贪婪匹配的正则中多加了一个”?“号,

想"x*?",”x+?“,”x??“,”x{n}?“,”x{n,}?“,”x{n,m}?“,这些都是非贪婪匹配正则的写法。

也就是说非贪婪匹配是在正则的量词”*“,”+“,”?“,”{n}“,”{n,}“,”{n,m}“后面添加一个”?“号来启动的。

不过至于非贪婪匹配模式有什么贪婪匹配替代不了的用途,至今还没有发现。有待以后有新的见解了再补上

原创文章,转载请注明来自:妹纸前端-www.webfront-js.com.
阅读(2290)
辛苦了,打赏喝个咖啡
微信
支付宝
妹纸前端
妹纸前端工作室 | 文章不断更新中
京ICP备16005385号-1