浅谈js正则之test方法bug篇

 更新时间:2020年04月08日 21:00:52   转载 作者:楼教主  
其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西

其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西

下面的代码都是在chrome的F12下调试的,大家可以研究一下

先来看个东西吧。

var re = /\d/;
console.log( re.test("1") );
console.log( re.test("1") );
console.log( re.test("1") );
console.log( re.test("1") );

全部是 true 没问题。。

但是你把 /\d/; 改成 /\d/g; 再试试。

再次修改:

console.log( /\d/g.test("1") );
console.log( /\d/g.test("1") );
console.log( /\d/g.test("1") );
console.log( /\d/g.test("1") );

全部是 true,这究竟是为什么呢?

这些结果相当有意思,当然高手自然知道为什么,如果你知道的话,下面其实可以跳过不用看了,全是水文而已。。

正则里有一个 lastIndex 的属性,是下一次匹配的开始位置。

var re = /\d/g;
console.log( re.test("1"), re.lastIndex );
console.log( re.test("1"), re.lastIndex );
console.log( re.test("1"), re.lastIndex );
console.log( re.test("1"), re.lastIndex );

可以看到 第一次匹配结果为 true 表示匹配成功,此时 lastIndex 记录下一次匹配的起始位置为 1。
于是第二次匹配的时候 从 "1" 字符串索引 1 的位置匹配,当然就匹配失败了,因为这个字符串只有一个字符,他的索引是 0。

/\d/g.test("1") 这个为什么每次匹配成功能呢?
因为它直接用正则字面量,相当于每次重新创建一个正则对象,lastIndex 属性的初始值是 0。
所以每次都能匹配成功。

现在是不是理解了,包括 exec 也一样,每次匹配一个,lastIndex 记录下次匹配的起始位置。
如果非要用一个正则对象的,那就只有每次 test 前重置 lastIndex 了,这样才能保证他不出意外。

var re = /\d/g;
console.log( re.test("1") );
re.lastIndex = 0;
console.log( re.test("1") );
re.lastIndex = 0;
console.log( re.test("1") );
re.lastIndex = 0;
console.log( re.test("1") );

好了,今天修改语法高亮插件花了不少时间,所以水了一篇,望大家海涵。。

相关文章

  • 匹配中文汉字的正则表达式介绍

    匹配中文汉字的正则表达式介绍

    这篇文章主要介绍了匹配中文汉字的正则表达式介绍,本文同时讲解了匹配中文字符的正则和匹配双字节字符的正则,需要的朋友可以参考下
    2015-04-04
  • 正则表达式的使用规则

    正则表达式的使用规则

    正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。这篇文章主要介绍了正则表达式的使用规则,需要的朋友可以参考下
    2019-08-08
  • 正则表达式(regex)错误使用导致功能漏洞分析

    正则表达式(regex)错误使用导致功能漏洞分析

    这篇文章主要介绍了正则表达式(regex)错误使用导致功能漏洞,需要的朋友可以参考下
    2015-10-10
  • 详解PHP正则表达式替换实现(PHP preg_replace,PHP preg_replace)

    详解PHP正则表达式替换实现(PHP preg_replace,PHP preg_replace

    PHP正则表达式替换实现是如何的呢?首先向你介绍下PHP preg_replace,PHP preg_replace的使用是我们实现的方法,那么对于PHP正则表达式替换实现过程我们从实例入手,感兴趣的跟着小编一起了解了解吧
    2015-09-09
  • JS基础系列之正则表达式

    JS基础系列之正则表达式

    正则表达式在开发中经常会用到,是个很好用的东东,今天小编就给大家分享js正则表达式的基础知识,非常适合新手学习
    2016-12-12
  • 循序渐进掌握递归正则表达式【推荐】

    循序渐进掌握递归正则表达式【推荐】

    这篇文章主要介绍了循序渐进掌握递归正则表达式的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08
  • 正则替换字符串功能

    正则替换字符串功能

    正则替换字符串功能...
    2007-10-10
  • 使用正则表达式 exec 获取字符串中的汉字

    使用正则表达式 exec 获取字符串中的汉字

    本文给大家简单总结了下正则表达式中实用EXEC获取字符串中汉字的方法,非常简单实用,并附上了基础语法,希望对大家学习正则表达式能够有所帮助
    2016-06-06
  • ubb js

    ubb js

    ubb js...
    2006-06-06
  • 55分钟学会正则表达式

    55分钟学会正则表达式

    正则表达式是一种用来描述一定数量文本的模式,用来匹配相同规范样式的文本。在JavaScript中用RegExp对象表示正则表达式( 即Regular Eexpression),它是对字符串执行模式匹配的强大工
    2016-03-03

最新评论