2011-08-22 71 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