我正在尝试用多个其他单词替换字符串中的多个单词。字符串是“我有一只猫,一只狗和一只山羊。”
然而,这不会产生“我有一只狗,一只山羊和一只猫”,而是产生“我有一只猫,一只猫和一只猫”。在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".
发布于 2013-03-25 05:26:10
具体解决方案
您可以使用一个函数来替换每个函数。
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];
});
泛化它
如果您想要动态维护正则表达式并仅将未来的交换添加到地图中,则可以这样做
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,例如来自MDN或Es5的polyfill。
发布于 2018-05-18 20:39:32
使用带编号的条目以防止再次替换。例如
let str = "I have a %1, a %2, and a %3";
let pets = ["dog","cat", "goat"];
然后
str.replace(/%(\d+)/g, (_, n) => pets[+n-1])
工作原理:- %\d+查找%后面的数字。括号中包含了数字。
这个数字(以字符串形式)是lambda函数的第二个参数n。
+n-1将字符串转换为数字,然后减去1来索引宠物数组。
然后将%number替换为数组索引处的字符串。
/g导致对每个数字重复调用lambda函数,然后将其替换为数组中的字符串。
在现代JavaScript中:
replace_n=(str,...ns)=>str.replace(/%(\d+)/g,(_,n)=>ns[n-1])
发布于 2013-03-25 07:59:19
在这种情况下,这可能不能满足您的确切需求,但我发现这是一种替换字符串中多个参数的有用方法,这是一种通用的解决方案。它将替换参数的所有实例,无论它们被引用了多少次:
String.prototype.fmt = function (hash) {
var string = this, key; for (key in hash) string = string.replace(new RegExp('\\{' + key + '\\}', 'gm'), hash[key]); return string
}
您可以按如下方式调用它:
var person = '{title} {first} {last}'.fmt({ title: 'Agent', first: 'Jack', last: 'Bauer' });
// person = 'Agent Jack Bauer'
https://stackoverflow.com/questions/15604140
复制相似问题