正则表达式未解析

时间:2016-09-14 10:24:13

标签: javascript regex

我解决了字符串中标记替换的问题,例如: “你好,#name!”应该评价为:“你好,约翰!” 我测试了基于regexp的算法,它工作正常。问题是,当我尝试添加标签以动态搜索时,它以某种方式不被解析。 所有代码:

    var replaceTags = function(str, tags) {
        var tagPattern = { search: "(^|[^#])((##)*)#", copy: "$1$2" };
        var result;
        var tagNames = Object.keys(tags);
        for(var i = 0; i < tagNames.length; i++) {
            var subDollarEscaped = tags[tagNames[i]].replace(RegExp("\\$", "g"), "$$$$");
            result = str.replace(RegExp(tagPattern.search + tagNames[i], "g"), tagPattern.copy + subDollarEscaped);
        }
        result = result.replace(RegExp("##", "g"), "#");

        return result;
    };

问题出在这一行:

result = str.replace(RegExp(tagPattern.search + tagNames[i], "g"), tagPattern.copy + subDollarEscaped);

不知何故,字符串没有正确连接。例如,将行更改为:

result = str.replace(RegExp(tagPattern.search + "name", "g"), tagPattern.copy + subDollarEscaped);

根据doc,Object.keys()应该返回字符串数组,但它看起来不是。我制作了控制台输出以确保标签“name”

tagPattern.search + tagNames[i]

真的评估为

(^|[^#])((##)*)#name

所以我真的很困惑。

1 个答案:

答案 0 :(得分:2)

以下是基于您的代码的代码段,它似乎有效。

&#13;
&#13;
var str = 'Hello there #name, occupant of room #room!',
    tags = {
        name:'Fomin',
        room:'123'
    },
    tagPattern = { search: "(^|[^#])((##)*)#", copy: "$1$2" },
    result=str,
    tagNames = Object.keys(tags),
    subDollarEscaped ;

for(var i = 0; i < tagNames.length; i++) {
  subDollarEscaped = tags[tagNames[i]].replace(RegExp("\\$", "g"), "$$$$");
  result = result.replace(RegExp(tagPattern.search + tagNames[i], "g"), tagPattern.copy + subDollarEscaped);
}

result = result.replace(RegExp("##", "g"), "#");
console.log('result:'+result);
&#13;
&#13;
&#13;

区别在于我将str分配给result开始,然后为result分配替换结果。