RegExp.test()异常分析
## 现象
代码如下:
[JavaScript] 纯文本查看 复制代码
const reg= /^[0-9]+$/g;
reg.test('123abcdef');
// true
reg.test('123abcdef');
// false
如上的代码,第一次测试返回true,第二次以及之后的调用都会返回false。
## 原因
这是因为RegExp.test()方法,第一次从位置0开始查找,可以匹配;第二次的查找位置就不是0了,说以就不能匹配了(加上了【g】修饰符才会有这个问题,第二次会从第一次匹配的位置后面开始查找,即lastIndex 属性规定的下次匹配的起始位置)。
## 解决方法:
方案1
去掉正则修饰符 g ,如下:
[JavaScript] 纯文本查看 复制代码
const reg= /^[0-9]+$/;
reg.test('123abcdef');
// true
reg.test('123abcdef');
// false
方案2
不要复用RegExp,每次测试前都使用新的RegExp对象。上述代码改为:
[JavaScript] 纯文本查看 复制代码
const getReg = () => {
const reg= /^[0-9]+$/g;
return reg;
}
getReg().test('123abcdef');
// true
getReg().test('123abcdef');
// true
方案3
很多时候,我们必须要执行 全局匹配( g ),这时候就不能使用第一种方案了。
其实,我们的lastIndex 属性是可读可写的。
只要目标字符串的下一次搜索开始,就可以对它进行设置。
[JavaScript] 纯文本查看 复制代码
const reg= /^[0-9]+$/g;
reg.test('123abcdef');
// true
reg.lastIndex = 0;
reg.test('123abcdef');
// true
|