我解决了字符串中标签替换的问题,例如:
“你好,#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
。