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

js中match()正则表达式的疑问

var re1 = /.*bbb/g;
var re2 = /.*?bbb/g;

alert("abbbaabbbaaabbbb1234".match(re1)+"");//abbbaabbbaaabbbb
alert("abbbaabbbaaabbbb1234".match(re2)+"");//abbb,aabbb,aaabbb


为什么match(re1)时不会像match(re2)时那样输出数组形式?

------解决方案--------------------
因为match(re1)没匹配成功,原数据返回(也就是只返回一个数组)
第二个匹配出三个数组!
说白了就是你这个问号问题:
var re1 = /.*bbb/g;
var re2 = /.*?bbb/g;
------解决方案--------------------
1输出的也是数组,只不过包含一个元素(贪婪匹配)。
------解决方案--------------------
属于贪婪模式的量词,也叫做匹配优先量词,包括:

“{m,n}”、“{m,}”、“?”、“*”和“+”。
在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:

“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。

可见 ,lz的第一个属于贪婪模式,第二个是非贪婪模式匹配。
贪婪模式 :就是在整个表达式匹配成功的前提下,尽可能最大长度的匹配
非贪婪模式:匹配特点是在长度尽可能小的范围内匹配,多次匹配,知道整个字符串结束。
------解决方案--------------------
第一个是贪婪模式匹配的,
.*匹配abbbaabbbaaabbbb1234,后面不是bbb,吐出一个字符
.*匹配abbbaabbbaaabbbb123,后面不是bbb,再吐出一个字符
直到
.*匹配abbbaabbbaaab,后面为bbb,匹配成功
返回
abbbaabbbaaabbbb
------解决方案--------------------
加? 是懒惰模式。 
------解决方案--------------------
两个返回的都是数组,只不过 length为1的数组被alert出来就看似成了字符(没有逗号)

	var re1 = /.*bbb/g;
var re2 = /.*?bbb/g;
 
window.console && console.log("abbbaabbbaaabbbb1234".match(re1)); //["abbbaabbbaaabbbb"]

alert("abbbaabbbaaabbbb1234".match(re1) instanceof Array);//abbbaabbbaaabbbb
alert("abbbaabbbaaabbbb1234".match(re2) instanceof Array);//abbb,aabbb,aaabbb




至于,是正则中非贪婪模式。

楼主可以在这里学习下
http://blog.csdn.net/lxcnn/article/category/538256