为什么这段代码先返回真,然后返回假
var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
演示:小提琴
为什么这段代码先返回真,然后返回假
var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
演示:小提琴
g
用于重复搜索。它将正则表达式对象更改为迭代器。如果您想使用该test
函数根据您的模式检查您的字符串是否有效,请删除此修饰符:
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
该test
函数与replace
或match
不消耗整个迭代相反,这使其处于“坏”状态。test
使用该函数 时,您可能永远不应该使用此修饰符。
您不想将 gi 与 pattern.test 结合使用。g 标志意味着它会跟踪您正在运行的位置,以便可以重复使用。因此,您应该使用:
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
此外,您可以对正则表达式使用 /.../[flags] 语法,如下所示:
var pattern = /mstea/i;
因为你设置了g
修饰符。
为您的情况将其删除。
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
这不是一个错误。
导致它在第一次匹配之后对子字符串g
执行下一次尝试匹配。这就是为什么它在每次偶数尝试中都返回 false 的原因。
First attempt:
It is testing "Amanda Olmstead"
Second attempt:
It is testing "d" //match found in previous attempt (performs substring there)
Third attempt:
It is testing "Amanda Olmstead" again //no match found in previous attempt
... so on
Regexp.exec
各州的 MDN 页面:
如果您的正则表达式使用“g”标志,您可以多次使用 exec 方法在同一字符串中查找连续匹配项。当您这样做时,搜索将从正则表达式的 lastIndex 属性指定的 str的子字符串开始
test
各州的 MDN 页面:
与 exec (或与它结合使用)一样,在同一个全局正则表达式实例上多次调用 test将超过上一次匹配。