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);创建一个正则表达式,这里的"."是匹配
任意字符的包括换行。