12

为什么这段代码先返回真,然后返回假

var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";

console.log('1', pattern.test(name));
console.log('1', pattern.test(name));

演示:小提琴

4

4 回答 4

9

g用于重复搜索。它将正则表达式对象更改为迭代器。如果您想使用该test函数根据您的模式检查您的字符串是否有效,请删除此修饰符:

var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";

test函数与replacematch不消耗整个迭代相反,这使其处于“坏”状态。test使用该函数 时,您可能永远不应该使用此修饰符。

于 2013-03-25T08:14:19.987 回答
7

您不想将 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;
于 2013-03-25T08:15:27.057 回答
3

因为你设置了g修饰符。

为您的情况将其删除。

var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
于 2013-03-25T08:15:17.837 回答
3

这不是一个错误。

导致它在第一次匹配之后对子字符串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将超过上一次匹配。

于 2013-03-25T08:16:31.967 回答