网络编程
位置:首页>> 网络编程>> JavaScript>> 为什么JavaScript中正则表达式的test方法会出错?

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

作者:Fdream 来源:Fdream博客 发布时间:2009-03-17 12:38:00 

标签:JavaScript,正则表达式,test,出错

一段这样的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; 
}

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com