一个简单的测试脚本:
<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>
Run Code Online (Sandbox Code Playgroud)
控制台输出:
["#fff", "fff"]
null
["#fff", "fff"]
null
["#fff", "fff"]
null
["#fff", "fff"]
null
["#fff", "fff"]
null
Run Code Online (Sandbox Code Playgroud)
当输入保持不变时,为什么其他每个结果都为null?
Mat*_*att 42
当您使用全局标志时,正则表达式变为"粘滞".也就是说,它使用计数器变量来跟踪找到最后一个匹配的位置.而不是每次从头开始匹配,粘性正则表达式实际上将在最后一个匹配结束的地方拾取.如果整个匹配失败,这个计数器只会重置为0(开头)(这就是为什么它每隔一次都有效)
在你的情况下,我的建议是放弃g
旗帜.
有关更多信息:RegExp @ MDC
马特回答了原因.我只是想补充一点,你可以看到这通过检查的价值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);
}
Run Code Online (Sandbox Code Playgroud)
输出是
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
Run Code Online (Sandbox Code Playgroud)
证明在循环的每个其他迭代中,正则表达式匹配从lastIndex
完成的位置开始.您可以lastIndex
在每次exec
调用前设置为0 或完全删除该标志.