【问题标题】:javascript string replace with all occurence with array valuejavascript字符串替换所有出现的数组值
【发布时间】:2017-03-20 13:31:36
【问题描述】:

我想替换所有出现的字符串,但问题是我有一个删除单词数组和删除单词值。

例如:

var string = "this is a string to replace. This string should be replaced using javascript";

var replaceArray = ["this","is","string","should","javascript"];

var replaceArrayValue = ["There","are","strings","have to","node.js"];

for (var i = replaceArray.length - 1; i >= 0; i--) {

    var finalAns = string.replace(replaceArray[i],replaceArrayValue[i]);
}

我期待类似的东西

There are strings to replace. There strings have to be replaced using node.js

我找到了一些解决方案,其中我得到了最好的解决方案here。 但我不能使用/string/g 中的字符串。我必须使用replaceArray[i]

【问题讨论】:

  • 你可以。 var regex = new RegExp(replaceArray[i], 'g')

标签: javascript arrays node.js string replace


【解决方案1】:

如果您更喜欢修复您的方法,您可以使用RegExp 构造函数来构建带有变量的动态正则表达式,并确保您只匹配包含单词边界的模式的整个单词。不要忘记转义文字模式,并在循环之前声明 finalAns 并使用 string var 内容进行初始化。

var string = "this is string to replace. this string should replace using javascript";
var replaceArray = ["this","is","string","should","javascript"];
var replaceArrayValue = ["There","are","strings","have to","node.js"];
var finalAns = string;
for (var i = replaceArray.length - 1; i >= 0; i--) {
    finalAns = finalAns.replace(RegExp("\\b" + replaceArray[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "\\b", "g"), replaceArrayValue[i]);
}
console.log(finalAns);

请注意,Roman's approach 使用单个静态正则表达式似乎对当前任务最有效(无需每次都动态构建正则表达式)。

【讨论】:

  • 如果要替换的单词有美元 ($) 符号,您将如何处理。
  • @ztalbot 使用replaceArrayValue[i].replace(/\$/g, '$$$$')
  • 哇,你的速度真快!我原来的问题编辑得不够快。 var string = "$this 是要替换的字符串。这个字符串应该使用 javascript 替换"; var replaceArray = ["$this","is","string","should","javascript"]; var replaceArrayValue = ["#There","are","strings","have to","node.js"];
  • 找到解决方案。我的原始字符串不同,我所要做的就是一个基本的 finalAns = finalAns.replace(replaceArray[i], replaceArrayValue[i]);
【解决方案2】:

替换函数使用以下方法:

var string = "this is string to replace. this string should replace using javascript",
    replaced = string.replace(/\b\w+\b/g, function ($m) {
        var search = ["this","is","string","should","javascript"],
            replacement = ["There","are","strings","have to","node.js"],
            key = search.indexOf($m);

        return (key !== -1)? replacement[key] : $m;
    });

console.log(replaced);

来自“高性能 JavaScript”(作者 Nicholas Zakas):

"... 关于超出范围的变量:存储任何经常使用的变量 局部变量中的范围外变量,然后访问本地 直接变量。”

【讨论】:

  • 应该是官方答案,对我来说用字符串替换类就像魅力一样,所有其他答案都会产生问题
【解决方案3】:

没有正则表达式

只能在循环中设置变量 string =finalAns; 。因为每次循环设置旧字符串都会发生问题,

var string = "this is string to replace. this string should replace using javascript";

var replaceArray = ["this","is","string","should","javascript"];

var replaceArrayValue = ["There","are","strings","have to","node.js"];
alert(replaceArray.length);
for (var i = replaceArray.length - 1 ; i >= 0; i--) {

    var finalAns = string.replace(replaceArray[i],replaceArrayValue[i]);
    string =finalAns;
}
alert(finalAns);

片段示例

var string = "this is string to replace. this string should replace using javascript";

var replaceArray = ["this","is","string","should","javascript"];

var replaceArrayValue = ["There","are","strings","have to","node.js"];

for (var i = replaceArray.length - 1 ; i >= 0; i--) {

    var finalAns = string.replace(replaceArray[i],replaceArrayValue[i]);
    string =finalAns;
}
alert(finalAns);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

    【解决方案4】:

    我使用声明性方法得出了一个解决方案:

    const string = 'boo and Boo2'
    const dictionary = { boo: 'faa', boo2: 'faa2' }
    return string.split(' ')
      .map(word => dictionary[word.toLowerCase()] ?? word)
      .join(' ')
    // 'faa and faa2'
    

    【讨论】:

      【解决方案5】:

      format 方法用于用给定数组的顺序替换所有出现的位置。

      formatAll 方法用于将所有第一次出现的单词替换为给定数组的顺序(在问题中要求)

      String.prototype.format = function (_key, _data) {
        return this.split(_key).map(function (value, index) { return _data[index] ? value + _data[index] : (value ? value : '') }).join("");
      }
      
      String.prototype.formatAll = function (_keys, _data) {
        let shift = () => { _keys.shift(); return _data.shift() }
        return this.split(/\s+/).map(function (value) { return value == _keys[0] ? shift() : value }).join(" ")
      }
      
      "path/of/0/object/s/0/feature".format(0, [10,22])
      //outputs
      'path/of/10/object/s/22/feature'
      
      "this is a string to replace. This string should be replaced using javascript".formatAll(["this","is","string","should","javascript"],["There","are","strings","have to","node.js"])
      //outputs
      'There are a strings to replace. This string have to be replaced using node.js'
      
      "Merhaba dünya! Merhaba ay!".formatAll(["Merhaba"], ["Hello"])
      //outputs
      'Hello dünya! Merhaba ay!'
      
      "Merhaba dünya! Merhaba ay!".formatAll(["Merhaba", "Merhaba"], ["Hello", "Selam"])
      //outputs
      'Hello dünya! Selam ay!'
      

      【讨论】:

        猜你喜欢
        • 2018-07-11
        • 2012-08-01
        • 2014-08-05
        • 2013-04-15
        • 2021-12-27
        • 2022-01-19
        相关资源
        最近更新 更多