6

Possible Duplicate:
Javascript regex returning true.. then false.. then true.. etc

First of all, apologize for my bad english.

I'm trying to test string to match the pattern, so I has wrote this:

var str = 'test';
var pattern = new RegExp('te', 'gi'); // yes, I know that simple 'i' will be good for this

But I have this unexpected results:

>>> pattern.test(str)
true
>>> pattern.test(str)
false
>>> pattern.test(str)
true

Can anyone explain this?

4

4 回答 4

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
于 2012-04-19T13:38:21.613 回答
2

我想你遇到了这个问题:https ://bugzilla.mozilla.org/show_bug.cgi?id=237111

删除g参数可以解决问题。基本上是由于lastindex每次执行test()方法时都会记住最后一个值的属性

于 2012-04-19T13:31:01.660 回答
2

引用MDN Docs(强调我的):

当您想知道是否在字符串中找到模式时,请使用测试方法(类似于 String.search 方法);有关更多信息(但执行速度较慢),请使用 exec 方法(类似于 String.match 方法)。与 exec (或与它结合使用)一样,在同一个全局正则表达式实例上多次调用 test 将超过上一次匹配。

于 2012-04-19T13:36:21.253 回答
0

这是该RegExp.test(str)方法的预期行为。正则表达式实例(模式)存储可以在lastIndex属性中看到的状态;每次您调用“测试”时,它都会更新该值,并且使用相同参数的后续调用可能会也可能不会产生相同的结果:

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".
于 2012-04-19T13:43:35.790 回答