luckily 发表于 2022-3-13 13:35

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

不苦小和尚 发表于 2022-3-13 16:09

不错不错小技巧

leven5 发表于 2022-3-13 17:02

你都^\d$了任何时候都不可能是true,别乱发东西了

晴灬天 发表于 2022-3-13 17:02

/^+$/g;

你这是有匹配边界吧,我看这个返回的也是false呢,是数字开头结尾的,可以匹配多个。结果应该都为false。

unmask 发表于 2022-3-13 18:27

你都明显的加边界了,字符abcdef怎么可能满足你的正则呢?
你把边界符号^$去掉,再试试是不是你想要的。
页: [1]
查看完整版本: JS正则RegExp.test(),第一次true,第二次false