日期:2014-05-16  浏览次数:20344 次

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);创建一个正则表达式,这里的"."是匹配

任意字符的包括换行。