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