JS正则RegExp.test(),第一次true,第二次false
RegExp.test()异常分析## 现象
代码如下:
const reg= /^+$/g;
reg.test('123abcdef');
// true
reg.test('123abcdef');
// false
如上的代码,第一次测试返回true,第二次以及之后的调用都会返回false。
## 原因
这是因为RegExp.test()方法,第一次从位置0开始查找,可以匹配;第二次的查找位置就不是0了,说以就不能匹配了(加上了【g】修饰符才会有这个问题,第二次会从第一次匹配的位置后面开始查找,即lastIndex 属性规定的下次匹配的起始位置)。
## 解决方法:
方案1
去掉正则修饰符 g ,如下:
const reg= /^+$/;
reg.test('123abcdef');
// true
reg.test('123abcdef');
// false
方案2
不要复用RegExp,每次测试前都使用新的RegExp对象。上述代码改为:
const getReg = () => {
const reg= /^+$/g;
return reg;
}
getReg().test('123abcdef');
// true
getReg().test('123abcdef');
// true
方案3
很多时候,我们必须要执行 全局匹配( g ),这时候就不能使用第一种方案了。
其实,我们的lastIndex 属性是可读可写的。
只要目标字符串的下一次搜索开始,就可以对它进行设置。
const reg= /^+$/g;
reg.test('123abcdef');
// true
reg.lastIndex = 0;
reg.test('123abcdef');
// true
不错不错小技巧 你都^\d$了任何时候都不可能是true,别乱发东西了 /^+$/g;
你这是有匹配边界吧,我看这个返回的也是false呢,是数字开头结尾的,可以匹配多个。结果应该都为false。 你都明显的加边界了,字符abcdef怎么可能满足你的正则呢?
你把边界符号^$去掉,再试试是不是你想要的。
页:
[1]