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

T. *_*one 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>
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

  • 我不知道...你生活和学习:D (3认同)

Rus*_*Cam 9

马特回答了原因.我只是想补充一点,你可以看到这通过检查的价值lastIndexRegExp之前和之后的对象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 或完全删除该标志.