如何在字符串中交换子字符串?

时间:2011-08-22 17:54:47

标签: javascript regex string

我正在尝试交换给定字符串中所有出现的一对子串。

例如,我可能想要将所有出现的“咖啡”替换为“茶”,将所有出现的“茶”替换为“咖啡”。

这是我想到的第一件事:

var newString = oldString.replace(/coffee/g, "__").replace(/tea/g, "coffee").replace(/__/g, "tea");

它大部分时间都有效,但如果我的输入字符串包含子串“__”,它将无法正常工作。

无论我给出什么输入,我都在找一些有用的东西,所以我想了更多,并想出了这个:

var pieces = oldString.split("coffee");
for (var i = 0; i < pieces.length; i++)
  pieces[i] = pieces[i].replace(/tea/g, "coffee");
var newString = pieces.join("tea");

它工作正常,但它有点丑陋和冗长。我尝试提出更简洁的内容,并使用jQuery内置的map function来提出这个:

var newString = $.map(oldString.split("coffee"), function(piece) {
  return piece.replace(/tea/g, "coffee");
}).join("tea");

这样更好,但我仍然觉得有一种非常简单的方法没有出现在我脑海中。这里有人知道更简单的方法吗?

5 个答案:

答案 0 :(得分:6)

怎么样?
theString.replace(/(coffee|tea)/g, function($1) {
     return $1 === 'coffee' ? 'tea' : 'coffee';
});

(我个人认为交换咖啡和茶是犯罪行为,但这是你的事)

答案 1 :(得分:2)

您可以使用以下功能:

var str = "I like coffee more than I like tea";
var newStr = str.replace(/(coffee|tea)/g, function(x) {
   return x === "coffee" ? "tea" : "coffee";
});
alert(newStr); 

Running example

答案 2 :(得分:0)

关闭。考虑一下:

var newString = oldString.replace("tea|coffee", function(match) {
    // now return the right one, just a simple conditional will do :)
});

快乐的编码。

答案 3 :(得分:0)

使用地图(一个对象)来定义替换内容的内容,然后使用一个功能来挖掘地图:

D:\MiLu\Dev\JavaScript :: type replace.js
function echo(s) { WScript.Echo(s) }
var
map = { coffee: "tea", tea: "coffee" },
str = "black tea, green tea, ice tea, teasing peas and coffee beans";
echo( str.replace( /\b(tea|coffee)\b/g, function (s) { return map[s] } ) );

D:\MiLu\Dev\JavaScript :: cscript replace.js
black coffee, green coffee, ice coffee, teasing peas and tea beans

答案 4 :(得分:0)

基于@ alexander-gessler的answer,但支持动态输入。

(尽管有可能打开代码注入的大门。)

function swapSubstrings(string, a, b) {
  return string.replace(
    new RegExp(`(${a}|${b})`, "g"),
    match => match === a ? b : a
  )
}