【问题标题】:How to replace multiple strings with other multiple strings at a time in javascript? [duplicate]如何在javascript中一次用其他多个字符串替换多个字符串? [复制]
【发布时间】:2020-04-01 00:08:24
【问题描述】:

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

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


【解决方案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);
  }
}

【讨论】:

  • 请注意,如果存在依赖链,则会遇到麻烦。例如,"a b".replaceAll(["a", "b"],["b", "c"]);,您可能期望"b c",但一一执行操作会得到"c c"。它还禁止用空字符串替换,因为if (str2[index]) 将它们解释为错误的。
【解决方案2】:

我更喜欢将替换存储为对象中的键值对或对数组。无论格式如何,您都可以通过使用| 交替加入要替换的值来动态创建正则表达式。然后给replace一个回调函数,以它的match参数为key,在swaps对象中查找其对应的pair。

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()]));

【讨论】:

  • 它似乎是我的 replaceAll 原型的一个很好的替代品。
  • 您当然可以进一步概括这一点,如果您愿意,可以将其放入原型中,并按照您的操作转义正则表达式特殊字符。
  • 太好了,感谢您的建议。
猜你喜欢
  • 2013-03-14
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 2011-07-01
相关资源
最近更新 更多