我试图用多个其他单词替换字符串中的多个单词。字符串是“我有一只猫,一只狗和一只山羊。”
然而,这并不会产生“我有一只狗、一只山羊和一只猫”,而是产生“我有一只猫、一只猫和一只猫”。是否有可能在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".
String.prototype.replaceSome = function() {
var replaceWith = Array.prototype.pop.apply(arguments),
i = 0,
r = this,
l = arguments.length;
for (;i<l;i++) {
r = r.replace(arguments[i],replaceWith);
}
return r;
}
/*
字符串的replaceSome方法
它需要尽可能多的参数,然后替换所有参数
我们指定的最后一个参数
2013年版权保存:Max Ahmed
这是一个例子:
var string = "[hello i want to 'replace x' with eat]";
var replaced = string.replaceSome("]","[","'replace x' with","");
document.write(string + "<br>" + replaced); // returns hello i want to eat (without brackets)
*/
jsFiddle: http://jsfiddle.net/CPj89/
这招对我很管用:
String.prototype.replaceAll = function(search, replacement) {
var target = this;
return target.replace(new RegExp(search, 'g'), replacement);
};
function replaceAll(str, map){
for(key in map){
str = str.replaceAll(key, map[key]);
}
return str;
}
//testing...
var str = "bat, ball, cat";
var map = {
'bat' : 'foo',
'ball' : 'boo',
'cat' : 'bar'
};
var new = replaceAll(str, map);
//result: "foo, boo, bar"
以防有人想知道为什么原来海报上的解决方案不管用:
var str = "I have a cat, a dog, and a goat.";
str = str.replace(/cat/gi, "dog");
// now str = "I have a dog, a dog, and a goat."
str = str.replace(/dog/gi, "goat");
// now str = "I have a goat, a goat, and a goat."
str = str.replace(/goat/gi, "cat");
// now str = "I have a cat, a cat, and a cat."
作为对以下问题的回答:
寻找最新的答案
如果在当前示例中使用“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);