我有一个基本的替换功能,但我需要它来执行全局替换,因为它似乎在第一个实例上停止。我不想用正则表达式来做。在大多数示例中,应用全局属性似乎很容易,但我传入一个变量作为要替换的值,而/ g没有任何影响。我究竟做错了什么?以下是没有/ g:
的示例测试字符串
"Why is my ^%friend so ^%? Maybe I need a ^!% one, abrand^!% one"
简单替换功能
function translate(oddStr) {
var tagDictionary = {};
tagDictionary['^%'] = 'odd';
tagDictionary['^!%'] = 'new';
Object.keys(tagDictionary).forEach( function (tag) {
oddStr = oddStr.replace(tag, tagDictionary[tag]);
});
return oddStr;
};
此函数按预期返回每个替换的第一个实例。如何将/ g应用于forEach中的tag变量?
答案 0 :(得分:2)
使用split
- join
组合,如下所示:
oddStr = oddStr.split(tag).join(tagDictionary[tag]);
答案 1 :(得分:1)
"Why is my ^% friend so ^%? Maybe I need a ^!% one, abrand ^!% one".replace(/\^%/g, 'odd').replace(/\^!%/g, 'new')
"Why is my odd friend so odd? Maybe I need a new one, abrand new one"
如果您需要从字符串创建正则表达式,可以使用RegExp
构造函数:new RegExp('\\^%', 'g')
。
如果您无法控制标记词典并且它来自某些外部资源,则您必须properly escape这些标记。
您最好使用lodash.template
之类的内容,而不是使用adhoc符号进行模板化答案 2 :(得分:0)
您需要转义正则表达式特殊字符(^
=字符串开头)
function translate(oddStr) {
var tagDictionary = {
'\\^%' : "odd",
'\\^!%' : 'new'
};
Object.keys(tagDictionary).forEach( function (tag) {
var r = new RegExp(tag, "g");
oddStr = oddStr.replace(r, tagDictionary[tag]);
});
return oddStr;
};
console.log(translate("Why is my ^%friend so ^%? Maybe I need a ^!% one, a brand ^!% one"));