您的位置:首页 > Web前端 > JavaScript

JavaScript中正则表达式RegExp对象的test方法

2010-12-18 21:55 1016 查看
今天在写一个正则表达式程序时,遇到一个很让人费解的问题:

代码如下

function isEmail(email){
var reEmail = new RegExp(//w+@/w+(/./w+)+/g);

alert("inside1:" + reEmail.test(email));
alert("inside2:" + reEmail.test(email));
return reEmail.test(email);
}

var usename = "cetc@cngrid.org";
alert("outerside:" + isEmail(usename));


运行时的结果并不是期望的,都是TRUE,而是

inside1:true

inside2:false

outer:true

运行多次都是这个结果,百思不得其解。Google查询相关问题,得到如下解释:

RegExp中有一个全局变量lastIndex,它记录待匹配串中下次匹配开始时的字符位置。默认为0,如果匹配成功,则是上次匹配串的长度,如果没有匹配成功,也返回0.

该变量有正则表达式对象的exec和test方法改变,也可以由String对象的replace,match和split等方法来改变,这个需要注意。

那么有了上面的知识,我们可以解释为什么运行的结果是上面的情况:即

第一次匹配,匹配成功,此时lastIndex的结果为email的长度;

当进行第二次匹配时,从上次匹配长度开始,则无法进行匹配,失败后lastIndex的值置为0;

当进行第三次匹配时,从-1开始,这时便可成功匹配,返回true。

解决该问题,可以有两种方法:

1)每次匹配时可以从新生成一个RegExp对象。如可以

//alert("inside1:" + //w+@/w+(/./w+)+/g.test(email));

//alert("inside2:" + //w+@/w+(/./w+)+/g.test(email));

 

2)在每次匹配时可以将RexExp的lastIndex属性置为0,(不提倡,也容易忘记)

为了验证上述的解释,我修改了程序:

function isEmail(email){
var reEmail = new RegExp(//w+@/w+(/./w+)+/g);

var another = "cetcdcngrid.orgjjj@test.com";
alert("inside1:" + reEmail.test(email));
alert("inside2:" + reEmail.test(another));

return reEmail.test(email);
}

var usename = "cetc@cngrid.org";
alert("outerside:" + isEmail(usename));
 

首先分析:

第一次匹配:匹配成功。RegExp的lastIndex为email的长度15。

第二次匹配:由于我修改了程序,another的长度大于15,同时15后面的字符串正好可以可以匹配该正则表达式。匹配成功,此时lastIndex为another的长度。

第三次匹配:从上次长度开始匹配,则失败。

运行结果:

inside1:true

inside2:true

outer:false

和上面的分析结果是吻合的。

 

注意小问题,继续积累。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息