正则表达式test验证的“bug”

在使用正则表达式对某些字符串进行验证时,我们常常会使用到test方法,而该方法也隐藏着一个陷阱,今天就让我们来看一下这个问题。

var str = 'hello jack, hello rose';

var reg = /jack/g;

reg.test(str);  //true

reg.test(str);  //false

正如上面显示的结果一样,第一次是true,第二次是false,而不是我们所想的false、false

那么为什么会出现这种情况?

原因是正则表达式后面加上了全局参数g之后,每当使用test进行一次校验,在正则表达式内部就会有一个lastIndex来记录匹配的位置

还是以上面的代码为例

第一次进行test之后,lastIndex就变成了10,第二次test就是从位置10开始匹配,而不是从位置0开始了,所以就无法匹配到jack了,因此结果为false。

有时候我们希望每次都是从头开始匹配,那么我们要如何来解决这个问题?

1.去掉全局参数g

2.每次使用后将lastIndex清0,即reg.lastIndex=0

3.不将正则表达式保存到变量,即/jack/g.test(str) 或者 /jack/.test(str)

原文地址:https://www.cnblogs.com/coolle/p/6257017.html