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"...

js用正则表达式来验证表单(比较齐全的资源),JS正则test()方法

在学习网页中的表单验证,顺便学习下正则表达式     在网上找了后发现了一个比较齐全的资源,稍微进行了一下排版     复制代码代码如下:     // 检查是否为有效的真实姓名,只能含有中文或大写的...
  • Baple
  • Baple
  • 2015年01月05日 15:15
  • 8904

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

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

js正则表达式实例(汇总)

转载来自:http://blog.csdn.net/lmb20056127/article/details/6455873 js正则表达式实例(汇总) 匹配结尾的数字 来源:如何用JAVASC...

修改一些IntelliJ IDEA 11的设置,使Eclipse的使用者更容易上手

用惯了Eclipse,再来使用IntelliJ IDEA真是很难适应。 设置1:字体 修改IDE的字体:设置-Appearance-Look and Feel-OverRide设置你想要的...
  • BenW1988
  • BenW1988
  • 2012年11月06日 11:18
  • 25594

spring集成shiro不进入自定义realm

前天学习shiro的时候,学着学着突然发现和spring集成的时候不能进入自定义realm了,查了两天也没找到原因,后来加了一位大神,帮我解决了这个问题,在这里非常感谢。 问题如下: 需求是:登录我写...
  • hgx2014
  • hgx2014
  • 2017年04月05日 17:38
  • 1703

js正则表达式中test,exec,match方法的区别说明

test  test 返回 Boolean,查找对应的字符串中是否存在模式。 var str = "1a1b1c"; var reg = new RegExp("1.", ""); alert...
  • JHON_03
  • JHON_03
  • 2017年07月16日 09:58
  • 171

js正则表达式中test,exec,match方法的区别说明

转自:http://www.jb51.net/article/46378.htm test test 返回 Boolean,查找对应的字符串中是否存在模式。 var str = "1a...

js正则表达式函数match、exec、test、search、replace、split使用介绍集合

match 方法 使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。  stringObj.match(rgExp)  参数  stringObj  必选项。对其进行查找的...

正则表达式中 test(),exec(),match() 方法的区别

test()  test 返回 Boolean,查找对应的字符串中是否存在模式。var str = "1a1b1c"; var reg = new RegExp("1.", ""); alert(re...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js正则表达式test方法的问题
举报原因:
原因补充:

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