在李炎恢的JavaScript视频中讲了很多种关于正则表达式的获取控制的方法:点元字符匹配,重复匹配,字符类匹配,锚符号匹配,分组模式匹配等等.这里主要总结一下正则表达式的获取控制中的贪婪和惰性模式的匹配. 这些模式匹配方法,敲个例子大概也就明白了.
关于正则表达式
关于贪婪和惰性模式.
解释:
一个贪婪的人看见一堆零食会怎样?? 他会尽自己最大可能的拿好多零食,能拿两个绝不会只拿一个.所谓的贪婪模式就是这样.在整个表达式匹配成功的前提下,尽可能多的匹配.
而一个懒惰的人,就算最好吃的零食,他也只是够吃饱就行了,一个能吃饱,就懒得再拿第二个.所谓的惰性模式就是,在整个表达式匹配成功的前提下,尽可能少的匹配.
实例:
var pattern=/[a-z]+/; //使用了贪婪模式
var str='abcdef';
alert(str.replace(pattern,'1')); //所有的字符串变成了1
//运行结果就是1
var pattern=/[a-z]+?/; //使用惰性模式
var str='abcdef';
alert(str.replace(pattern,'1')); //只有第一个字符变成了1,后面没有匹配
//运行结果就是1bcdef
var pattern=/8(.*)8/; //使用了贪婪模式
var str='8google8 8google8 8google8';
document.write(str.replace(pattern,'<strong>$1</strong>'));
//结果是google8 8googlr8 8google
var pattern=/8(.*?)8/; //使用了惰性
var str='8google8 8google8 8google8'; //匹配到了goole8 8googlr8 8google
document.write(str.replace(pattern,'<strong>$1</strong>'));
//结果是google 8google8 8google8
不管是贪婪还是惰性模式,在遇到全局开启的情况下会怎样呢??
全局匹配模式:使用了'g'标识符.在全局匹配下,会对指定查找的字符串进行多次匹配.
var pattern=/[a-z]+/g; //使用了贪婪模式
var str='abcdef';
alert(str.replace(pattern,'1')); //所有的字符串变成了1
//运行结果就是1
var pattern=/[a-z]+?/g; //使用惰性模式,开启全局
var str='abcdef';
alert(str.replace(pattern,'1')); //只有第一个字符变成了1,后面没有匹配
//运行结果就是111111
var pattern=/8(.*)8/g; //使用了贪婪模式,全局开启
var str='8google8 8google8 8google8'; //匹配到了goole8 8googlr8 8google
document.write(str.replace(pattern,'<strong>$1</strong>'));
//结果是google8 8googlr8 8google
var pattern=/8(.*?)8/g; //使用了惰性,开启全局
var str='8google8 8google8 8google8'; //匹配到了goole8 8googlr8 8google
document.write(str.replace(pattern,'<strong>$1</strong>'));
//结果是google google google
通过上面全局开启和未开启的两种情况的比较,能发现点什么呢?
贪婪模式,在开启全局和不开启全局下的结果是一样的.因为贪婪模式就是贪婪到底,和全局匹配要多次匹配是一样的道理.
而惰性模式,在开启全局的时候,就会进行多次匹配.得到的结果也是不一样的.