RegExp.test(JavaScript)的错误

时间:2017-05-07 04:34:21

标签: javascript regex debugging

我在我的代码中找到了有趣的问题。 Here是我的代码的简化版本。每次调用时,调用regex.test都会更改其输出值。您可以尝试在devtools中使用select'进行评估。它会告诉你不同的价值观。

1 个答案:

答案 0 :(得分:6)

问题是你在正则表达式中使用/g - 当使用它时,正则表达式被执行多次,它将始终从上次停止的地方开始。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex

  

仅当正则表达式实例使用" g"时才设置此属性。标志以指示全局搜索。以下规则适用:

     

如果lastIndex大于字符串的长度,则test()和exec()失败,则lastIndex设置为0.

     

如果lastIndex等于字符串的长度,并且正则表达式与空字符串匹配,则正则表达式匹配从lastIndex开始的输入。

     

如果lastIndex等于字符串的长度,并且正则表达式与空字符串不匹配,则正则表达式输入不匹配,lastIndex重置为0.

     

否则,lastIndex将设置为最近一次匹配后的下一个位置。

您可以在循环中执行console.log(regex.lastIndex)来验证这一点:

for (var a = 0; a < 10; a++) {
    console.log(regex.lastIndex)
    if (!regex.test(inner)) {
        log.innerHTML += "true";
    }
    else {
        log.innerHTML += "false";
    }

    log.innerHTML += " ";
}

你会看到它在0 18之间交替。因此,当它从0开始时,它匹配,当它从18开始时,它不匹配。