为什么此代码首先返回true,然后返回false
var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
演示:Fiddle
答案 0 :(得分:9)
g
用于重复搜索。它将正则表达式对象更改为迭代器。如果您想使用test
函数根据您的模式检查字符串是否有效,请删除此修饰符:
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
与test
或replace
相反,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一起)一样,多次调用 在同一个全局正则表达式实例上将超越 上一场比赛。