//第一种测试
for(var i=0;i<5;i++){ var subject = 'two’; try{ console.log(testParser(subject)); }catch(err){ console.log(err.message); } } //结果
{ regExp: /.two./g } No Match { regExp: /.two./g } No Match { regExp: /.two./g } 看吧,还是有没有匹配到的吧。罪过啊。
//第二种测试
for(var i=0;i<5;i++){ var subject = 'two’; try{ console.log(matchParser(subject)); }catch(err){ console.log(err.message); } } //结果
{ regExp: /.two./g } { regExp: /.two./g } { regExp: /.two./g } { regExp: /.two./g } { regExp: /.two./g } 代码有点多,你们自己去看吧 javascript的中的test和match,结果你不敢相信
楼主,建议你收藏这个网址: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects 根据 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp 正如 2 楼指出的 lastIndex 属性。 match 是用于循环匹配的,每次 match 就会更新 regex.lastIndex,到底了会被重置为0。 上面程序的输出结果是正确的。 标准库里都有写明的,一点都不坑。
@davidzhang 抱歉,你说得对,没看仔细。而且 match 也不是循环的,exec才是,I stand corrected。 文档也没明确地指出 test 的特性,测试了一下你的代码,把 g 去掉就可以了。看来 test 更像是 exec 的 shortcut
@davidzhang 上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。所以输出正确啊,不知道哪里坑了。如果你输出其他结果倒是奇怪