JavaScript中正则表达式RegExp对象的test方法
2010-12-18 21:55
1016 查看
今天在写一个正则表达式程序时,遇到一个很让人费解的问题:
代码如下
运行时的结果并不是期望的,都是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,(不提倡,也容易忘记)
为了验证上述的解释,我修改了程序:
首先分析:
第一次匹配:匹配成功。RegExp的lastIndex为email的长度15。
第二次匹配:由于我修改了程序,another的长度大于15,同时15后面的字符串正好可以可以匹配该正则表达式。匹配成功,此时lastIndex为another的长度。
第三次匹配:从上次长度开始匹配,则失败。
运行结果:
inside1:true
inside2:true
outer:false
和上面的分析结果是吻合的。
注意小问题,继续积累。
代码如下
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
和上面的分析结果是吻合的。
注意小问题,继续积累。
相关文章推荐
- JavaScript 正则表达式对象RegExp test方法慎用/g
- JavaScript 正则表达式对象RegExp test方法慎用/g
- JavaScript 正则表达式(RegExp对象、属性、方法、String支持)
- javascript正则表达式对象方法 compile() exec() test()的比较
- JavaScript中的String对象的常用方法、文本框对象的常用方法和事件、正则表达式的概念、正则表达式的几种构造方式、RegExp对象使用什么方法匹配正则表达式、
- JavaScript之基础-10 JavaScript 正则表达式(概述、定义正则、RegExp对象、用于模式匹配的String方法)
- Js 正则表达式对象(方法:exec、test、match、search)
- 注意 JavaScript 中 RegExp 对象的 test 方法
- javascript 正则表达式与方法--search(),replace(),test(),exec()
- JavaScript语法入门系列(七) 类和对象(正则表达式RegExp)
- 注意 JavaScript 中 RegExp 对象的 test 方法
- 简述JavaScript的正则表达式中test()方法的使用
- Javascript 正则表达式RegExp对象
- JavaScript 正则表达式之RegExp属性、方法及应用分析
- javascript RegExp对象(正则表达式)
- JavaScript学习笔记-正则表达式(RegExp对象)
- Javascript 正则表达式-对象与方法
- 注意 JavaScript 中 RegExp 对象的 test 方法
- JavaScript 正则表达式对象RegExp
- JavaScript RegExp (正则表达式对象)