为什么`pattern.test(name)`在连续调用时产生相反的结果

时间:2013-03-25 08:10:14

标签: javascript regex

为什么此代码首先返回true,然后返回false

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

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

演示:Fiddle

4 个答案:

答案 0 :(得分:9)

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

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

testreplace相反,match函数不会消耗整个迭代,从而使其处于“错误”状态。在使用test函数时,您可能永远不会使用此修饰符。

答案 1 :(得分: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;

答案 2 :(得分:3)

因为您设置了g修饰符。

为您的案例删除它。

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

答案 3 :(得分: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   方法多次在同一个字符串中查找连续匹配。   执行此操作时,搜索从指定的str的子字符串开始   正则表达式的lastIndex属性

test州的MDN页面:

  

与exec(或与exec一起)一样,多次调用   在同一个全局正则表达式实例上将超越   上一场比赛。