在使用正则表达式对某些字符串进行验证时,我们常常会使用到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)