全局搜索时在JavaScript中使用RegExp的错误

时间:2012-04-19 13:29:08

标签: javascript regex

  

可能重复:
  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

任何人都能解释一下吗?

4 个答案:

答案 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".