一个简单的测试脚本:
<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
当输入保持不变时,为什么其他每个结果都为空?
答案 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