2011-08-22 34 views
5

我想交换给定字符串内的一对子字符串的所有匹配项。如何交换字符串中的子字符串?

例如,我可能希望用“茶”替换所有出现的“咖啡”,并用“咖啡”替换所有出现的“茶”。

这是我想到的第一件事:

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"); 

这是更好,但我仍然有一种感觉,有一些精辟简单的方法是不能出现在我的脑海里。这里有人知道更简单的方法吗?

回答

6

什么

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

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

0

关闭。考虑一下:

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

快乐编码。

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

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