javascript中的正则表达式每隔一次使用相同的输入失败一次

javascript中的正则表达式每隔一次使用相同的输入失败一次,javascript,regex,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> 为什么输入保持不变时其他结果都为空?您的问题是第二个参数中的“gi”,我刚刚将其删除并在Chrome

一个简单的测试脚本:

<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>
为什么输入保持不变时其他结果都为空?

您的问题是第二个参数中的
“gi”
,我刚刚将其删除并在Chrome控制台上测试:

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

当您使用全局标志时,正则表达式变为“粘滞”。也就是说,它使用一个计数器变量来跟踪找到最后一个匹配项的位置。而不是每次都从一开始就匹配,一个粘性正则表达式实际上会选择最后一个匹配的结束位置。如果整个匹配失败(这就是它每隔一次工作的原因),此计数器将仅重置回0(开始)

在你的情况下,我的建议是去掉
g
标志

有关更多信息:

已回答了原因。我只是想补充一点,您可以通过在
exec
调用前后检查
RegExp
对象上的
lastIndex
的值来查看这一点

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);
}

证明在循环的每一次迭代中,正则表达式匹配都从
lastIndex
完成的地方开始。您可以在每次调用
exec
之前将
lastIndex
设置为0,或者完全删除该标志。

我在网上找到了这个…

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

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

我认为在重新运行exec方法之前,需要修改
lastindex
属性。

在此处阅读更多信息:

$将图案锚定到行尾。如果没有这些,像
#fff之类的东西也会匹配。当然,在它现在的位置上,正则表达式将匹配
诸如此类的废话,因为它没有用
^
锚定到行的开头,我不知道。。。你生活和学习:D
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