Javascript正则表达式中的惰性量词
最近在看《Javascript高级程序设计》觉得写得很不错,项目实践体验后,在看这种书,体会很深,觉得很多知识都是恍然大悟了。看到正则表达式那张,讲到非捕获性分组的时候,有一个过滤html标签的例子,不是很明白:
/<(?:.|\s)*?>/g
对于第二个问号,我不是很理解,于是就去查资料,才发现原来这个是惰性匹配,在贪婪量词的后面加多一个?就变成了惰性量词,它的匹配过程相反,是从前面第一个开始,不匹配则加一个,如此循环直到字符串结束,以上面的为例子。
var s = "abbbaabbbaaabbb1234";
var re1=/.*?bbb/g; //*?是惰性量词
re1.test(s);
它的匹配过程如下:
re1.test("a"); //false, 再加一个
re1.test("ab"); //false, 再加一个
re1.test("abb"); //false, 再加一个
re1.test("abbb"); //true, 匹配了,保存这个结果,再从下一个开始
re1.test("a"); //false, 再加一个
re1.test("aa"); //false, 再加一个
re1.test("aab"); //false, 再加一个
re1.test("aabb"); //false, 再加一个
re1.test("aabbb"); //true, 匹配了,保存这个结果,再从下一个开始。
原来是这样啊,明白了!
ps:其实html标签的匹配一种简单的正则表达式为:/<[^>]*>/