在复习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
贪婪:先看整个字符串是否匹配,如果没有发现匹配,则去掉最后一个字符再尝试匹配,直至发现一个匹配或字符串不剩任何字符
惰性:先看第一个字符是否匹配,如果没有发现匹配。则读入下一个字符,组成两个字符串,再尝试匹配,直至发现一个匹配或整个字符串检查过了都没匹配
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
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的。这就导致了匹配后的错误。具体的你可以网上找一下。
带g是有lastIndex属性的,即下次查找从lastIndex位置找。
不带g每次都从起始位置查找。
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
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呢
但是今天我在公司里的时候 用公司里的电脑,用IEtester测出来 IE8 IE7,ff,chorme却是都为true。
这个表示抱歉,当时发现问题后 没有在后面说明,sorry