首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用多个其他字符串替换多个字符串

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

Stack Overflow用户
提问于 2013-03-25 05:19:55
回答 20查看 334.6K关注 0票数 269

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

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

代码语言: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".
EN

回答 20

Stack Overflow用户

发布于 2013-03-25 05:26:10

具体解决方案

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

代码语言:javascript
复制
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 example

泛化它

如果您想要动态维护正则表达式并仅将未来的交换添加到地图中,则可以这样做

代码语言:javascript
复制
new RegExp(Object.keys(mapObj).join("|"),"gi"); 

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

代码语言:javascript
复制
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];
});

要添加或更改更多替换项,只需编辑地图即可。

fiddle with dynamic regex

使其可重用

如果你想让它成为一个通用的模式,你可以把它拉到下面这样的函数中

代码语言:javascript
复制
function replaceAll(str,mapObj){
    var re = new RegExp(Object.keys(mapObj).join("|"),"gi");

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

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

fiddle with function

为了确保Object.keys可以在旧浏览器中运行,可以添加一个polyfill,例如来自MDNEs5的polyfill。

票数 539
EN

Stack Overflow用户

发布于 2018-05-18 20:39:32

使用带编号的条目以防止再次替换。例如

代码语言:javascript
复制
let str = "I have a %1, a %2, and a %3";
let pets = ["dog","cat", "goat"];

然后

代码语言:javascript
复制
str.replace(/%(\d+)/g, (_, n) => pets[+n-1])

工作原理:- %\d+查找%后面的数字。括号中包含了数字。

这个数字(以字符串形式)是lambda函数的第二个参数n。

+n-1将字符串转换为数字,然后减去1来索引宠物数组。

然后将%number替换为数组索引处的字符串。

/g导致对每个数字重复调用lambda函数,然后将其替换为数组中的字符串。

在现代JavaScript中:

代码语言:javascript
复制
replace_n=(str,...ns)=>str.replace(/%(\d+)/g,(_,n)=>ns[n-1])
票数 14
EN

Stack Overflow用户

发布于 2013-03-25 07:59:19

在这种情况下,这可能不能满足您的确切需求,但我发现这是一种替换字符串中多个参数的有用方法,这是一种通用的解决方案。它将替换参数的所有实例,无论它们被引用了多少次:

代码语言:javascript
复制
String.prototype.fmt = function (hash) {
        var string = this, key; for (key in hash) string = string.replace(new RegExp('\\{' + key + '\\}', 'gm'), hash[key]); return string
}

您可以按如下方式调用它:

代码语言:javascript
复制
var person = '{title} {first} {last}'.fmt({ title: 'Agent', first: 'Jack', last: 'Bauer' });
// person = 'Agent Jack Bauer'
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15604140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档