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

然而,这并不会产生“我有一只狗、一只山羊和一只猫”,而是产生“我有一只猫、一只猫和一只猫”。是否有可能在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".

当前回答

试试我的解决方案。请随意改进

函数multiReplace(字符串,regex,替换){ 返回str.replace(regex, function(x) { //检查替换键以防止错误,如果为false则返回原始值 return Object.keys(replace).includes(x) ?替换[x]: x; }); } var str = "我有一只猫,一只狗,和一只山羊。"; //(json)使用value替换键 Var替换= { “猫”:“狗”, “狗”:“山羊”, “山羊”:“猫”, } console.log(multiReplace(str, /Cat|dog|goat/g, replace))

其他回答

试试我的解决方案。请随意改进

函数multiReplace(字符串,regex,替换){ 返回str.replace(regex, function(x) { //检查替换键以防止错误,如果为false则返回原始值 return Object.keys(replace).includes(x) ?替换[x]: x; }); } var str = "我有一只猫,一只狗,和一只山羊。"; //(json)使用value替换键 Var替换= { “猫”:“狗”, “狗”:“山羊”, “山羊”:“猫”, } console.log(multiReplace(str, /Cat|dog|goat/g, replace))

使用正则函数定义要替换的模式,然后使用replace函数处理输入字符串,

var i = new RegExp('"{','g'),
    j = new RegExp('}"','g'),
    k = data.replace(i,'{').replace(j,'}');

这个解决方案可以只替换整个单词——例如,当搜索“猫”时,“catch”、“ducat”或“locator”将找不到。这可以通过对正则表达式中每个单词前后的单词字符使用负向后查找(?<!\w)和负向前查找(?!\w)来实现:

(?<!\w)(cathy|cat|ducat|locator|catch)(?!\w)

JSFiddle demo: http://jsfiddle.net/mfkv9r8g/1/

我写了这个npm包stringinject https://www.npmjs.com/package/stringinject,它允许你做以下事情

var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]);

这将替换{0}和{1}与数组项,并返回以下字符串

"this is a test string for stringInject"

或者你可以像这样用对象键和值替换占位符:

var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" });

"My username is tjcafferkey on Github" 

作为对以下问题的回答:

寻找最新的答案

如果在当前示例中使用“words”,则可以使用非捕获组扩展Ben McCormick的答案,并在左侧和右侧添加单词边界\b以防止部分匹配。

\b(?:cathy|cat|catch)\b

防止部分匹配的单词边界 (?:非捕获组 Cathy |cat|catch匹配其中一个选项 )关闭非捕获组 防止部分匹配的单词边界

原问题的例子:

let str = "我有一只猫,一只狗和一只山羊。"; const mapObj = { 猫:“狗”, 狗:“山羊”, 山羊:“猫” }; str = str.replace(/\b(?:猫|狗|山羊)\b/gi, matched => mapObj[matched]); console.log (str);

评论中的例子似乎并没有很好地工作:

let str = "I have a cat, a catch and a cathy."; const mapObj = { 凯茜:“猫”, 猫:“抓”, 抓住:“凯蒂” }; str = str.replace(/\b(?:cathy|cat|catch)\b/gi, matched => mapObj[matched]); console.log (str);