我解释了第一个str的匹配,感觉没理解错,但是,第二个str2为什么不对?
var str = "aaab";
alert(str.match(/a+?/)[0]); //首先a+,匹配一个或者多个a,然后加了一个问号,就是匹配1个a
 
var str2 = "aaab";
alert(str2.match(/a*?b/)[0]);
   // a*匹配0个或多个a , 后面加了?,匹配0个a,最后有个b所以匹配一个b,为什么匹配出来的是整个字符串???

解决方案 »

  1.   

    a*?b 和 a+?b 都会匹配整个字符串这样看就清楚了:
    alert(str2.match(/(a*)?b/)[0]);   ///aaab
    alert(str2.match(/(a*)?b/)[1]);   ///aaa看出来了没有,a* 是一个整体,匹配aaa 
      

  2.   

    alert(str2.match(/(a*)?b/)[1]); ///aaa
    第一组匹配出aaab,我知道。。
    第二组的情况难道不是(a*)?为0次吗? 怎么不是b?
      

  3.   

    * 与 *?的区别?
    答:1)*为贪婪模式,如何理解贪婪模式,首先理解定义:贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配。关键理解:尽可能多。“*” 在正则表达匹配0次或者匹配0次以上,那么在贪婪模式下,就是选则以0次以上进行字符匹配,所以叫贪婪模式。
    2)*?为非贪婪模式,如何理解非贪婪模式,首先理解定义非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。如果理解了贪婪模式,那么非贪婪就是其反面,还是拿“*”举例,在非贪婪模式,就是先以0次进行匹配,如果0次不行在用0次以上进行匹配。
    不知道有没有理解,如果没理解,请详细看http://blog.csdn.net/zyloveyrf/article/details/6937797有了上面的基础知识,下面帮助你分析问题,你也就好理解多了。var str = "aaab";
    alert(str.match(/a+?/)[0]);+?为非贪婪模式,+ 有1次或者大于1次的匹配,因为是在非贪婪模式下,正则选则了1次匹配,也就是说是aab,但是aab不能匹配成功,那正则表达式就会回溯,正则选择1次以上匹配,aaab匹配成功。var str2 = "aaab";
    alert(str2.match(/a*?b/)[0]);
    如果能理解我上面的分析,下面的原理也是一样的,首先因为是非贪婪模式下,那么正则选择0次匹配,也就是说是ab,但是匹配不成功,那么进行回溯,正则选择0次以上匹配,aaab匹配成功。注:回溯, 如果有数据库知识的同学,应该知道事务的回滚,其实是一个意思;如果没有,回溯其实是正则碰到这些个量词(+,*,?)时进行了备份,当匹配不成功时,就回返回前一个位置进行备份的选择,然后重新匹配。希望可以帮助你