我正在尝试用多个其他单词替换字符串中的多个单词。字符串是“我有一只猫,一只狗和一只山羊。”
然而,这并不产生“我有一只狗、一只山羊和一只猫”,而是产生“我有一只猫、一只猫和一只猫”。在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".
26条答案
按热度按时间oug3syen1#
作为对以下问题的答复:
正在寻找最新的答案
如果您在当前示例中使用“单词”,则可以使用非捕获组扩展ben mccormick的答案,并添加单词边界
\b
在左侧和右侧,以防止部分匹配。let str = "I have a cat, a dog, and a goat.";
const mapObj = {
cat: "dog",
dog: "goat",
goat: "cat"
};
str = str.replace(/\b(?:cat|dog|goat)\b/gi, matched => mapObj[matched]);
console.log(str);
let str = "I have a cat, a catch, and a cathy.";
const mapObj = {
cathy: "cat",
cat: "catch",
catch: "cathy"
};
str = str.replace(/\b(?:cathy|cat|catch)\b/gi, matched => mapObj[matched]);
console.log(str);
iqjalb3h2#
特定溶液
您可以使用一个函数替换每个函数。
JSFIDLE示例
概括起来
如果您想动态地维护regex,并且只需将未来的交换添加到Map中,您可以这样做
生成正则表达式。那么看起来是这样的
要添加或更改任何其他替换,您只需编辑Map即可
摆弄动态正则表达式
使其可重复使用
如果你想让它成为一个通用模式,你可以把它拉出来,变成这样一个函数
因此,您只需将str和替换的Map传递给函数,它就会返回转换后的字符串。
玩弄功能
为了确保object.keys在较旧的浏览器中工作,请从mdn或es5添加polyfill。
hmtdttj43#
在本例中,这可能无法满足您的确切需求,但我发现这是替换字符串中多个参数的一种有用方法,是一种通用解决方案。它将替换参数的所有示例,无论引用了多少次:
您可以按如下方式调用它:
cnwbcb6i4#
使用编号的项目以防止再次更换。如
然后
工作原理:-%\d+查找%后面的数字。括号表示数字。
该数字(作为字符串)是lambda函数的第二个参数n。
+n-1将字符串转换为数字,然后减去1以索引pets数组。
然后将%数字替换为数组索引处的字符串。
/g导致使用每个数字重复调用lambda函数,然后用数组中的字符串替换这些数字。
在现代javascript中:-
eoigrqb65#
使用array.prototype.reduce():
例子
lh80um4z6#
这对我很有用:
jei2mxaa7#
使用我的replace once软件包,您可以执行以下操作:
7qhs6swi8#
万一有人想知道为什么原始海报的解决方案不起作用:
bwleehnv9#
此解决方案可以调整为仅替换整个单词-因此,例如,“catch”、“ducat”或“locator”在搜索“cat”时不会被找到。这可以通过使用负查找来完成
(?<!\w)
消极前瞻(?!\w)
关于正则表达式中每个单词前后的单词字符:JSFIDLE演示:http://jsfiddle.net/mfkv9r8g/1/
y1aodyip10#
使用常规函数定义要替换的模式,然后使用替换函数处理输入字符串,
2nc8po8w11#
nkkqxpd912#
您可以使用分隔符查找和替换字符串。
nbnkbykc13#
注意!
如果您使用的是动态提供的Map,那么这里的任何解决方案都不够!
在这种情况下,有两种方法可以解决这个问题,(1)使用分割连接技术,(2)使用带有特殊字符转义技术的正则表达式。
这是一种拆分联接技术,比另一种快得多(至少快50%):
这是一种正则表达式特殊字符转义技术,它也可以工作,但速度要慢得多:
后者的优点是,它还可以用于不区分大小写的搜索。
iezvtpos14#
我修改了ben mccormick的答案,以便与您的新测试用例一起使用。
我只是在正则表达式中添加了单词边界:
“运行代码段”以查看以下结果:
dpiehjr415#
/*replacesome方法用于字符串,它接受我们想要的参数,并使用我们指定的最后一个参数替换所有参数。2013版权保存为:max ahmed这是一个示例:
jsfiddle:http://jsfiddle.net/cpj89/