//第一种测试
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,结果你不敢相信
大家看看解释一下 ,是不是很奇葩,具体代码 可以去那个网址看看,不理解,test和match有啥不同的机制嘛?
regExp有一个属性是lastIndex
楼主,建议你收藏这个网址: 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。 上面程序的输出结果是正确的。 标准库里都有写明的,一点都不坑。
@klesh 我说的是test啊
@klesh 我说的是test的比较坑 在循环操作的时候,会间隔匹配,第一个匹配完之后第二次就匹配不到,但是match是可以的。
@java0racle regExp这个是我自己写出来了,不是什么方法,你确定你们看过那个代码?
@davidzhang 抱歉,你说得对,没看仔细。而且 match 也不是循环的,exec才是,I stand corrected。 文档也没明确地指出 test 的特性,测试了一下你的代码,把 g 去掉就可以了。看来 test 更像是 exec 的 shortcut
写法有问题
@klesh 对的,所以感觉有点坑的。
@chloe 如何才能没有问题,给个解决的办法?
@java0racle 为啥我一定要用lastindex,使用match在做循环的匹配的时候就很好的解决了这个问题
@davidzhang 上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。所以输出正确啊,不知道哪里坑了。如果你输出其他结果倒是奇怪
@davidzhang 不是来帮你解决问题,是帮你了解问题产生的背后机制。我以前也是用match解决的,但是学会后面的原理才是学到东西不是吗?
@java0racle 谢啦