日期:2014-05-16 浏览次数:20344 次
正则表达式中量词有下面六种:
?表示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);创建一个正则表达式,这里的"."是匹配
任意字符的包括换行。