在复习js的时候发现了以前学习时留下来的疑问以下是对贪婪和惰性匹配项时的一些描述:
贪婪:先看整个字符串是否匹配,如果没有发现匹配,则去掉最后一个字符再尝试匹配,直至发现一个匹配或字符串不剩任何字符
惰性:先看第一个字符是否匹配,如果没有发现匹配。则读入下一个字符,组成两个字符串,再尝试匹配,直至发现一个匹配或整个字符串检查过了都没匹配
        reg1 = /.*bbb/;
        reg2 = /.*?bbb/;         reg1.test('abbbaabbbaaabbb1234').toString() //ie8,ff,谷歌中都为true
        reg1.test('abbbaabbbaaabbb123').toString() //ie8,ff,谷歌中都为true
        reg1.test('abbbaabbbaaabbb1').toString() //ie8,ff,谷歌中都为true
        reg1.test('abbbaabbbaaabbb').toString() //ie8,ff,谷歌中都为true
        reg2.test('abbbaabbbaaabbb1234').toString() //ie8,ff,谷歌中都为true
以上的我都能理解,不理解的是下面的代码执行出来的结果,请高手解释一下是什么原因?难道仅仅是浏览器对正则的解释不同还是怎么的?
        var reg1 = /.*bbb/g;  //和上面的相比,无g参数
        var reg2 = /.*?bbb/g;  //和上面的相比,无g参数
        //var reg3=/.*+bbb/g;

        'abbbaabbbaaabbb1234'.match(reg1) //返回abbbaabbbaaabbb
        'abbbaabbbaaabbb1234'.match(reg2) //返回abbb,aabbb,aaabbb        //不理解之处
        reg1.test('abbbaabbbaaabbb1234').toString() //ie8中false,ff,谷歌中true
        reg1.test('abbbaabbbaaabbb123').toString() //ie8中true,ff,谷歌中false
        reg1.test('abbbaabbbaaabbb1').toString() //ie8中false,ff,谷歌中true
        reg1.test('abbbaabbbaaabbb').toString() //ie8中true,ff,谷歌中false
        reg2.test('abbbaabbbaaabbb1234').toString() //ie8中false,ff,谷歌中true
        reg2.test('abbbaabbbaaabbb123').toString()     //ie8,ff,谷歌中都为true
        reg2.test('abbbaabbbaaabbb1').toString() //ie8,ff,谷歌中都为true
        reg2.test('abbbaabbbaaabbb').toString() //ie8中true,ff,谷歌中false

解决方案 »

  1.   

                document.writeln(reg1.test('abbbaabbbaaabbb1234').toString()) //ie8中false,ff,谷歌中true
                document.writeln(reg1.test('abbbaabbbaaabbb1234').toString()) //ie8中false,ff,谷歌中true
                document.writeln(reg1.test('abbbaabbbaaabbb123').toString()) //ie8中true,ff,谷歌中false
                document.writeln(reg1.test('abbbaabbbaaabbb123').toString()) //ie8中true,ff,谷歌中false
                document.writeln(reg1.test('abbbaabbbaaabbb1').toString()) //ie8中false,ff,谷歌中true
                document.writeln(reg1.test('abbbaabbbaaabbb1').toString()) //ie8中false,ff,谷歌中true
                document.writeln(reg1.test('abbbaabbbaaabbb').toString()) //ie8中true,ff,谷歌中false
                document.writeln(reg1.test('abbbaabbbaaabbb').toString()) //ie8中true,ff,谷歌中false
                document.writeln(reg2.test('abbbaabbbaaabbb1234').toString()) //ie8中false,ff,谷歌中true
                document.writeln(reg2.test('abbbaabbbaaabbb1234').toString()) //ie8中false,ff,谷歌中true
                document.writeln(reg2.test('abbbaabbbaaabbb123').toString()) //ie8,ff,谷歌中都为true
                document.writeln(reg2.test('abbbaabbbaaabbb123').toString()) //ie8,ff,谷歌中都为true
                document.writeln(reg2.test('abbbaabbbaaabbb1').toString()) //ie8,ff,谷歌中都为true
                document.writeln(reg2.test('abbbaabbbaaabbb1').toString()) //ie8,ff,谷歌中都为true
                document.writeln(reg2.test('abbbaabbbaaabbb').toString())//ie8中true,ff,谷歌中false
                document.writeln(reg2.test('abbbaabbbaaabbb').toString()) //ie8中true,ff,谷歌中false
    在任何浏览器下都试试看g是在RegExp的全局记录一个lastIndex的。这就导致了匹配后的错误。具体的你可以网上找一下。
      

  2.   


    带g是有lastIndex属性的,即下次查找从lastIndex位置找。
    不带g每次都从起始位置查找。
      

  3.   

    写明白点。var reg1 = /.*bbb/g;//带g参数,表明此正则表达式lastIndex启用。
                document.writeln(reg1.test('abbbaabbbaaabbb1234').toString());//此时从-1开始查找,返回true
                document.writeln(reg1.lastIndex);//此时的lastIndex为15
                document.writeln(reg1.test('abbbaabbbaaabbb1234').toString());//此时从15开始查找,返回false false时 lastIndex为0
                document.writeln(reg1.lastIndex);//此时的lastIndex为0
                document.writeln(reg1.test('abbbaabbbaaabbb123').toString());//此时从0开始查找,返回true
                //如不带g则每次都从0查找,以上均为true
      

  4.   

    var reg1 = /.*bbb/g;     //和上面的相比,无g参数
    var reg2 = /.*?bbb/g;     //和上面的相比,无g参数
       //var reg3=/.*+bbb/g;
            
    'abbbaabbbaaabbb1234'.match(reg1)    //返回abbbaabbbaaabbb
    'abbbaabbbaaabbb1234'.match(reg2)    //返回abbb,aabbb,aaabbb        //不理解之处
    reg1.test('abbbaabbbaaabbb1234').toString()    //ie8中false,ff,谷歌中true在IE8下false,ff,chorme下true呢
      

  5.   

    其实这个原因是ie下,match会修改lastIndex,而其它的下面不会修改。然后才有了1,2,3楼说的那些。
      

  6.   

    这样跟你说吧,我写这套代码是用我自己的机子WIN7+IE8,当是确实是这样的结果
    但是今天我在公司里的时候 用公司里的电脑,用IEtester测出来 IE8 IE7,ff,chorme却是都为true。
    这个表示抱歉,当时发现问题后 没有在后面说明,sorry
      

  7.   

    嗯 ,后来测试的时候就直接把match都删了,确实为我不严谨的答案表示抱歉