小编典典

用多个其他字符串替换多个字符串

node.js

我正在尝试用多个其他单词替换字符串中的多个单词。字符串是“我有一只猫,一条狗和一只山羊”。

但是,它不会产生“我有一只狗,一只山羊和一只猫”,而是会产生“我有一只猫,一只猫和一只猫”。在JavaScript中是否可以同时用多个其他字符串替换多个字符串,以便产生正确的结果?

var str = "I have a cat, a dog, and a goat.";
str = str.replace(/cat/gi, "dog");
str = str.replace(/dog/gi, "goat");
str = str.replace(/goat/gi, "cat");

//this produces "I have a cat, a cat, and a cat"
//but I wanted to produce the string "I have a dog, a goat, and a cat".

阅读 249

收藏
2020-07-07

共1个答案

小编典典

具体解决方案

您可以使用一个函数替换每个函数。

var str = "I have a cat, a dog, and a goat.";
var mapObj = {
   cat:"dog",
   dog:"goat",
   goat:"cat"
};
str = str.replace(/cat|dog|goat/gi, function(matched){
  return mapObj[matched];
});

jsfiddle示例

概括它

如果您想动态维护正则表达式并仅将将来的交换添加到地图,则可以执行此操作

new RegExp(Object.keys(mapObj).join("|"),"gi");

生成正则表达式。所以它看起来像这样

var mapObj = {cat:"dog",dog:"goat",goat:"cat"};

var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
str = str.replace(re, function(matched){
  return mapObj[matched];
});

要添加或更改其他替换,您只需编辑地图即可。

摆弄动态正则表达式

使其可重用

如果您希望将其作为通用模式,则可以将其拉出类似这样的函数

function replaceAll(str,mapObj){
    var re = new RegExp(Object.keys(mapObj).join("|"),"gi");

    return str.replace(re, function(matched){
        return mapObj[matched.toLowerCase()];
    });
}

因此,您只需将str和所需替换的映射传递给函数,它将返回转换后的字符串。

摆弄功能

为了确保Object.keys在较旧的浏览器中可以正常工作,请添加一个polyfill例如从MDNEs5

2020-07-07