示例
var regex = /^\d*$/g;
var s = '2333';
console.log(regex.test(s));
console.log(regex.lastIndex);
console.log(regex.test(s));
console.log(regex.lastIndex);
console.log(regex.test(s));
console.log(regex.lastIndex);
console.log(regex.test(s));
console.log(regex.lastIndex);
运行结果:
问题
看上面运行结果,可以发现,全局正则表达式多次匹配同一字符串,返回的结果不一致。
原因
原因出在全局正则表达式的 全局 这一属性上,正则表达式若是设置了全局匹配,则该正则表达式的 lastIndex
属性会在匹配时变化如下:
- 匹配成功时, lastIndex
属性值会被设置为:匹配成功的子字符串的最后一个字符,在原字符串中的索引值再加1。若再次利用该正则对字符串进行匹配,它以 lastIndex
属性值作为匹配的起点,先后进行匹配。
- 匹配失败时, lastIndex
属性值会被设置为0。
综上所述,同一正则多次匹配同一字符串结果不一致的问题就不难理解了
解决对同一字符串匹配结果不一致问题
- 方式一:不设置正则的全局属性
- 方式二:若正则必须要使用全局属性,在每一次匹配之后,手动将正则的
lastIndex
属性值设置为0。