如何在javascript中一次用字符串的其他多个字符替换多个字符?

问题描述 投票:2回答:2

我有一个字符串原型,其代码如下:

String.prototype.replaceAll = function(str1, str2, ignore) { 
  return this.replace(
    new RegExp(
      str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"
    ):str2
  )};

用法:

var a = "I am Javascript";
console.log(
  a.replaceAll("am", "love")
); // => I love Javascript

但是,关于字符或单词的多次交换,我必须多次运行原型才能实现。但我想到过这样的事情:

  var a = "I am Java";
  console.log(
    a.replaceAll(["am" , "Java"], ["love", "Javascript"])
  ); // => I love Javascript

所以您能帮我实现它吗?还是有其他选择?

javascript regex string
2个回答
4
投票

我希望将替换项存储为对象中的键值对或成对的数组。不管采用哪种格式,都可以通过使用|替换连接要替换的值来动态创建正则表达式。然后为replace提供一个回调函数,并使用其match参数作为键在swaps对象中查找其对应对。

const s = "I am Java";
const swaps = {am: "love", Java: "JS"};
const pattern = new RegExp(Object.keys(swaps).join("|"), "g");
console.log(s.replace(pattern, m => swaps[m]));

要处理不区分大小写的替换,请确保swaps中的所有键都是小写字母(通过编程方式或手动方式,具体取决于用法),并在键入之前将匹配的内容转换为小写:

const s = "I am Java";
const swaps = {am: "love", java: "JS"};
const pattern = new RegExp(Object.keys(swaps).join("|"), "gi");
console.log(s.replace(pattern, m => swaps[m.toLowerCase()]));

1
投票

这有效。

String.prototype.replaceAll = function(str1, str2, ignore) {

  let flags = 'g';
  if (ignore) {
    flags += 'i';
  }

  if (Array.isArray(str1) && Array.isArray(str2)) {
    let newStr = this;

    str1.map((element, index) => {
      if (str2[index]) {
        newStr = newStr.replace(new RegExp(element, flags), str2[index]);
      }
      return newStr;
    });
    return newStr;
  }
  else {
    return this.replace(new RegExp(str1, flags), str2);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.