javascript中的正则表达式每次都以相同的输入失败

时间:2011-02-09 21:09:15

标签: javascript regex

一个简单的测试脚本:

<script type="text/javascript">
    var reg = new RegExp('#([a-f0-9]{3})$', 'gi');
    for (var i = 0; i < 10; i++) {
        console.log(reg.exec('#fff'));
    }
</script>

控制台输出:

["#fff", "fff"]
null
["#fff", "fff"]
null
["#fff", "fff"]
null
["#fff", "fff"]
null
["#fff", "fff"]
null

当输入保持不变时,为什么其他每个结果都为空?

4 个答案:

答案 0 :(得分:39)

当您使用全局标志时,正则表达式变为“粘滞”。也就是说,它使用计数器变量来跟踪找到最后一个匹配项的 。而不是每次从头开始匹配,粘性正则表达式实际上将在最后一个匹配结束的地方拾取。如果整个匹配失败,这个计数器只会重置为0(开头)(这就是为什么它每隔一段时间都有效)

在您的情况下,我的建议是删除g标记。

有关详细信息:RegExp @ MDC

答案 1 :(得分:9)

Matt 已回答原因。我只是想通过在lastIndex调用之前和之后检查RegExp对象上exec的值来添加您可以看到这一点

var reg = new RegExp('#([a-f0-9]{3})$', 'gi');
for (var i = 0; i < 10; i++) {
    console.log(reg.lastIndex);
    console.log(reg.exec('#fff'));
    console.log(reg.lastIndex);
}

输出

0
["#fff", "fff"]
4

4
null
0

0
["#fff", "fff"]
4

4
null
0

0
["#fff", "fff"]
4

4
null
0

0
["#fff", "fff"]
4

4
null
0

0
["#fff", "fff"]
4

4
null
0

undefined

演示在循环的每个其他迭代中,正则表达式匹配从lastIndex完成的位置开始。您可以在每次lastIndex来电之前将exec设置为0,或者完全删除该标记。

答案 2 :(得分:3)

您的问题是第二个参数中的"gi",我刚删除它并在Chrome控制台上进行了测试:

var reg = new RegExp('#([a-f0-9]{3})$');

答案 3 :(得分:1)

我在网上发现了这个......

  

调用 exec()函数也会更改 RegExp 对象的lastIndex属性。
  它将索引存储在主题字符串中,下一次匹配尝试将在该字符串中开始。
  您可以修改此值以更改的起始位置   下次调用 exec()

您描述的行为表明RegExp对象的状态通过调用 exec()方法进行了修改。

我认为在重新运行exec方法之前需要修改lastindex属性 在此处阅读更多内容:Javascript Regexp Object