可能重复:
Javascript regex returning true.. then false.. then true.. etc
首先,为我糟糕的英语道歉。
我正在尝试测试字符串以匹配模式,所以我写了这个:
var str = 'test';
var pattern = new RegExp('te', 'gi'); // yes, I know that simple 'i' will be good for this
但我有这个意想不到的结果:
>>> pattern.test(str)
true
>>> pattern.test(str)
false
>>> pattern.test(str)
true
任何人都能解释一下吗?
答案 0 :(得分:12)
此行为的原因是RegEx不是无状态的。您的第二个test
将继续在字符串中查找下一个匹配项,并报告它不再找到。进一步搜索从头开始,因为未找到匹配时重置lastIndex
:
var pattern = /te/gi;
pattern.test('test');
>> true
pattern.lastIndex;
>> 2
pattern.test('test');
>> false
pattern.lastIndex;
>> 0
当有两个匹配项时,您会注意到这种情况会发生变化,例如:
var pattern = /t/gi;
pattern.test('test');
>> true
pattern.lastIndex;
>> 1
pattern.test('test');
>> true
pattern.lastIndex;
>> 4
pattern.test('test');
>> false
pattern.lastIndex;
>> 0
答案 1 :(得分:2)
我想你遇到了这个问题:https://bugzilla.mozilla.org/show_bug.cgi?id=237111
删除g
参数可解决此问题。基本上它是由于lastindex
属性在每次执行test()
方法时记住最后一个值
答案 2 :(得分:2)
引用MDN Docs(强调我的):
当您想知道是否在字符串中找到模式时,请使用test方法(类似于String.search方法);有关更多信息(但执行速度较慢),请使用exec方法(类似于String.match方法)。与exec(或与其结合使用)一样,在同一个全局正则表达式实例上多次调用的测试将超过上一个匹配。
答案 3 :(得分:0)
这是RegExp.test(str)
method的预期行为。正则表达式实例(模式)存储可以在lastIndex
属性中看到的状态;每次调用“test”时,它都会更新该值,并且使用相同参数的调用可能会产生或不会产生相同的结果:
var str="test", pattern=new RegExp("te", "gi");
pattern.lastIndex; // => 0, since it hasn't found any matches yet.
pattern.test(str); // => true, since it matches at position "0".
pattern.lastIndex; // => 2, since the last match ended at position "1".
pattern.test(str); // => false, since there is no match after position "2".