javascript正则表达式贪婪和惰性量词详解和实例

正则表达式中量词有下面六种:

?表示0次或1次

* 表示0次或0次以上

+ 表示1次活1次以上

{n} 表示正好n次

{n,m} 表示n-m次

{n,}表示n次以上

简单的应用上面的还是很简单的。例如:

var str = "bad bbad";

var patt = /b?a\w*/g;

console.log(str.match(patt))

得到结果:["bad", "bad"]

其他的类似。下面看贪婪的、惰性的和支配性的量词。下面是对这些的解释:

贪婪的                    惰性的                        支配性的                      描述

 ?                         ??                         ?+                        表示0次或1次

 *                          *?                            *+                        表示0次或0次以上

 +                          +?                            ++                        表示1次活1次以上

 {n}                        {n}?                          {n}+                      表示正好n次

{n,m}                       {n,m}?                        {n,m}+                    表示n-m次

{n,}                        {n,}?                         {n,}+                     表示n次以上

有一个好的方法记忆就是后面什么都没跟的就是贪婪的,跟一个"?"的是惰性的,跟一个"+"的是支配性的。浏览器对支配性的不是很好,IE和Firef和Ghrome都不支持

都会出现错误。下面看实例

var str = "abbbaabbbaaabbb1234";

var patt1 = /.*bbb/g;   //贪婪的   得到结果 ["abbbaabbbaaabbb"]

var patt2 = /.*?bbb/g;  //惰性的   得到结果 ["abbb", "aabbb", "aaabbb"]

try{

var patt3 = /.*\+bbb/g; //支配性的   都不支持,本来是为false的

console.log(str.test(patt3))

}catch(e){

console.log("e")

}

console.log(str.match(patt1))

console.log(str.match(patt2))

怎么理解贪婪和惰性,这个从字面上去理解就是贪婪的总是企图要匹配整个字符串,而惰性的只要匹配出结果就行了。一个大的特点是:贪婪的是从字符串后面开始匹配

从后面到前面,如果有匹配的了就再也不匹配了。而惰性的是从前面开始匹配,找到匹配的了。记录下匹配结果,又从下面一个字符开始匹配。直到字符串最后。

再来一个实例:

var str = "<%@ 8%>\n<%header.jsp'%> \n<html> \n<head> \n</head> \n<% r \nInt(10); \n; \n; \n; \n;\n%>\nb"+"\nb\nh\n"

console.log(str)

var patt = /<%([\w\W]*)%>/igm;  //多行匹配  得到结果["<%@ 8%>\n<%header.jsp'%>...Int(10); \n; \n; \n; \n;\n%>"]

var patt = /<%([\w\W]*?)%>/igm;  //多行匹配  得到结果["<%@ 8%>", "<%header.jsp'%>", "<% r \nInt(10); \n; \n; \n; \n;\n%>"]

console.log(str.match(patt));

注意上面的patt不能写成这样,var patt = /<%(.*?)%>/igm;  如果是这样那惰性的和贪婪的都得到同样的结果:["<%@ 8%>", "<%header.jsp'%>"]

原因是"."不能匹配换行和回车。在java中创建一个可以通过这样Pattern p = Pattern.compile("<%(.*?)%>", Pattern.DOTALL);创建一个正则表达式,这里的"."是匹配

任意字符的包括换行。

相关推荐