如何对变量执行全局替换?

时间:2017-01-28 17:59:28

标签: javascript

我有一个基本的替换功能,但我需要它来执行全局替换,因为它似乎在第一个实例上停止。我不想用正则表达式来做。在大多数示例中,应用全局属性似乎很容易,但我传入一个变量作为要替换的值,而/ 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变量?

3 个答案:

答案 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"));