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

    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()应该返回字符串数组,但看起来没有。我进行了控制台输出,以确保标记“名称”

tagPattern.search + tagNames[i]


真正评估为

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


所以我真的很困惑。

最佳答案

这是一个基于您的代码的片段,它似乎可以正常工作。



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);





区别在于,我首先将str分配给result,然后将替换结果分配给result

10-08 13:04