Fdream's Blog
专注于WEB前端开发
Powered by Google

为什么JavaScript中正则表达式的test方法会出错?

13 未知 2009-3
Fdream 发表于 Ajax Web, 已被阅读 724 次, 评论 1 条
关键词:javascript 正则表达式
[ 阅读字体大小: ]

一段这样的JavaScript代码,猜猜结果如何?

参考代码: [复制代码] [保存代码]

var i = 0, m = 20, a = [], r = /^\d+$/g;
for(i = 0; i < m; i++){
    a.push('' + i);
}

m = a.length;
for(i = 0; i < m; i++){
    if(r.test(a[i])){
        document.write(a[i] + 'true<br />');
    }
    else{
        document.write(a[i] + 'false<br />');
    }
}

也许你期待的结果应该全是true,可是实际结果呢?true和false交替出现,0是true,1是false,2是true,3是false……是不是很怀疑?其实仔细看一下,那个正则表达式多了个全局选项“g”,去掉就好了。

可是为什么有“g”就会出错呢?

原因其实很简单,当一个模式具有全局选项时,和exec一样,每次test都会保留上次匹配的位置——即lastIndex。很显然,当第一次匹配之后,第二次匹配时的lastIndex已经到了字符串末尾,尽管这个时候字符串已经是一个新的字符串了,但是这个lastIndex的位置并没有重新初始化,所以会从末尾开始匹配——当然会匹配失败了。

解决方案有两种:

  • 去掉正则表达式后面的g;
  • 每次完成匹配之后重置模式的lastIndex属性;

使用重置lastIndex的代码:

参考代码: [复制代码] [保存代码]

var i = 0, m = 20, a = [], r = /^\d+$/g;
for(i = 0; i < m; i++){
    a.push('' + i);
}

m = a.length;
for(i = 0; i < m; i++){
    if(r.test(a[i])){
        document.write(a[i] + 'true<br />');
    }
    else{
        document.write(a[i] + 'false<br />');
    }
    r.lastIndex = 0;
}

OK~

Related articles 您可能对这些文章也感兴趣:
Related comments 与该文相关的评论:(我也想说几句)
引用这个评论  mz 于 5/18/2009 8:18:31 AM 发表评论: 

https://bugzilla.mozilla.org/show_bug.cgi?id=98409

https://bugzilla.mozilla.org/show_bug.cgi?id=98409
Add a comment 我来说两句: 
禁止表情
禁止UBB
禁止图片
识别链接
识别关键字
表  情
arrow
用户名:   密码:  (匿名可不写) 同时注册?
验证码:   看不清?换个图片  看不清楚?换个图片

 
Copyright © 2005-2008,Fdream All Rights Reserved
Processed in 0.3750048 second(s) , unknow queries
Powered by OWord V0.1, Even Not Alpha
(此博客程序为半成品,请勿索取,以免给您的心灵造成创伤^_^)
鄂ICP备05026031号