js正则表达式test方法的问题

原创 2016年07月26日 18:14:45

今天在网上碰到一个帖子,写了一个关于Regex的奇怪现象,(文章来源http://www.php100.com/html/webkaifa/javascript/2007/0109/1866.html)

代码如下

<script type="text/javascript">
<!--
var re = /^\d+(?:\.\d)?$/ig;   

alert(re.test('112.3'));
alert(re.test('112.3'));
//-->
</script>
执行发现2行输出结果不一样,第一个是true,第二个是false

文章给的建议是每次都重新创建re对象

......
alert(/^\d+(?:\.\d)?$/ig.test('112.3'));
alert(/^\d+(?:\.\d)?$/ig.test('112.3'));
......
这下2个都是true了,但是为什么呢?

文字结尾一段英文回复,着重说了lastIndex 的作用,可能回复者想说明这种问题的原因是lastIndex 导致的,于是我把代码改成以下样子

......
alert(re.lastIndex);//0
alert(re.test('112.3'));//true
alert(re.lastIndex);//5
re.lastIndex = 0;
alert(re.test('112.3'));//true
......
果然是因为lastIndex 被修改造成的,那为什么lastIndex 改过去之后在下一次test之前不重置成0呢?

经过多次测试,我发现re改成/^\d+(?:\.\d)?$/i都是正常的,即去掉全文搜索,那如果改成/\d+(?:\.\d)?/ig(去掉全字符串匹配限制)呢,结果是这样的

<script type="text/javascript">
<!--
var re = /\d+(?:\.\d)?/ig; 
alert(re.lastIndex);//0
alert(re.test('112.3'));//true
alert(re.lastIndex);//5
alert(re.test('112.3'));//false
alert(re.lastIndex);//0
alert(re.test('112.3'));//true
alert(re.lastIndex);//5
alert(re.test('111112.3'));//true
alert(re.lastIndex);//8
//-->
</script>


总结:

g进行全文搜索,每次test之后会保留下一次查询的位置到lastIndex里,当执行下一次test的时候就会从lastIndex的位置开始,如果匹配到就是true,否则false;

^$限制导致必须整个字符串作为一个整体匹配regex,比如第一次test的是112.3,lastIndex是5,如果第二次test的是1234112.3,虽然匹配到5开始的位置,但是由于是整个字符串限制,所以还是false,这也就解释了为什么去掉^$限制后第二次test变成true了。感觉^$限制和g最好不要一起用,没有意义而且容易造成不好识别的错误





版权声明:本文为博主原创文章,未经博主允许不得转载。

JS正则test()方法

每个正则表达式都有一个 lastIndex 属性,用于记录上一次匹配结束的位置,包括exec方法。 var re = /^[1-9]\d{4,10}$/gi; var str = "123456"...
  • z69183787
  • z69183787
  • 2014年01月05日 17:11
  • 49617

JS Test方法

 test 方法返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式。rgexp.test(str)参数rgexp必选项。包含正则表达式模式或可用标志的正则表达式对象。str必选项。要在...
  • pc70762540
  • pc70762540
  • 2009年06月03日 11:53
  • 134

javascript中的test方法

 定义和用法test() 方法用于检测一个字符串是否匹配某个模式.语法RegExpObject.test(string)参数描述string必需。要检测的字符串。返回值如果字符串 string 中含有...
  • wzumath
  • wzumath
  • 2009年11月20日 10:47
  • 4913

关于JS正则表达式中g模式下test出现true/false交替的个人见解

原文链接:http://bbs.blueidea.com/thread-2996104-1-1.html(出处: 经典论坛) 文章中的有些东西来自Franky大神的文章. Franky原文...
  • changhuzhao
  • changhuzhao
  • 2017年03月22日 17:32
  • 625

js正则表达test、exec和match的区别

以前用js很少用到js的正则表达式,即使用到了,也是诸如邮件名称之类的判断,网上代码很多,很少有研究,拿来即用。 最近开发遇到一些需要使用正则表达式,顺便研究一下 正则表达式对象有两个...
  • z69183787
  • z69183787
  • 2014年01月05日 17:06
  • 12788

正则表达式test(),慎用g

今天在将这个表达式时,发现了一个问题: test()检测指定字符串是否存在返回一个布尔值  var  reg=/cat/g; var str='this a cat,this a dog';...
  • lydia88
  • lydia88
  • 2016年09月28日 14:09
  • 1313

.test()和.match()方法的异同

搬W3C对这两个方法的定义: test() 方法用于检测一个字符串是否匹配某个模式. match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。 test和match都是字...
  • woouu
  • woouu
  • 2017年04月18日 10:46
  • 357

TEST js

  • 2008年02月23日 14:25
  • 700B
  • 下载

cocos2d-js解析官方js-test实例入口

继续上一篇,搭建好cocos2d-js环境后,主要是html5环境,接下来步入入门阶段,许多人都说官网demo是最好的入门资料,今天就剖析官风提供的js-test入口,界面如下: 这上面有个关闭按钮...
  • shenshucong520
  • shenshucong520
  • 2015年09月02日 15:48
  • 7276

JS正则表达式-test()方法的使用

简单粗暴我喜欢~ JS正则表达式(1)--test()方法的使用   var re =/se/i; //声明一个正则表达式,所有匹配he字母的,如果说要忽略大小写,就加个i,(i表示i...
  • qq_32183461
  • qq_32183461
  • 2016年07月07日 15:58
  • 232
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js正则表达式test方法的问题
举报原因:
原因补充:

(最多只允许输入30个字)