【问题标题】:Bug with RegExp in JavaScript when do global search [duplicate]全局搜索时 JavaScript 中的 RegExp 错误 [重复]
【发布时间】:2012-05-01 00:44:02
【问题描述】:

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

谁能解释一下?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    这种行为的原因是 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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回答!是的,我现在删除g 解决了这个问题。但是这个错误也出现在 Chrome 中...
      • 这不是错误。 testexec 就是为此而设计的。现在让我去找骗子……
      • 我不会说这是一个错误。这就是正则表达式的实现方式。确实这对 OP 来说是个问题
      • @F.Calderan,我忘记将我的评论指向 GeorgeVinogradov,对此深表歉意。
      • @F.Calderan,这就是答案!非常感谢!
      【解决方案3】:

      引用MDN Docs(强调我的):

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

      【讨论】:

        【解决方案4】:

        这是RegExp.test(str) method 的预期行为。正则表达式实例(模式)存储可以在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".
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          • 2011-08-02
          • 2018-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多