Javascript:当串联连接时,新的Regexp会破坏循环迭代器

时间:2017-05-31 11:38:20

标签: javascript regex for-loop iterator string-concatenation

我有一个名为script的对象。它包含一个名为name的变量,其中包含一个字符串。

还有一个包含multiptle脚本对象的数组,该数组称为脚本。它的大小是5。

我有一个for循环,我想为每个与“(”:

连接的脚本对象的名称创建一个新的RegExp
var scriptName;
for(var i=0; i<scripts.length; i++){
    console.log("i = "+i);
    scriptName = scripts[i].name+"(";
    var newRegex = new RegExp(scriptName, 'g');
}

问题在于,每当我将脚本[i] .name与“(”for循环停止工作)连接起来。而不是增加i,它停止在i = 0.这是奇怪的因为for循环仍然停止而不是无限循环

如果我更换

scriptName = scripts[i].name+"(";

scriptName = scripts[i].name;

我得到了正确的输出: 0,1,2,3,4

否则我得到输出0 x 5次

1 个答案:

答案 0 :(得分:1)

在构建RegExp之前,您需要转义字符串 - 如下所示:

var scriptName;
for(var i=0; i<scripts.length; i++){
    console.log("i = "+i);
    scriptName = scripts[i].name+"(";
    // Escape for regex
    var escapedName = scriptName.replace(
        /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"
    );
    var newRegex = new RegExp(escapedName, 'g');
}

有趣的/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g部分与正则表达式特殊字符匹配,例如^ + ( ),然后替换在它们之前添加斜杠,以便它们是解析字符串时忽略。