2013-08-29 60 views
3

可以說我有一串這樣的單詞和短語。替換字符串中的單詞和短語 - Javascript

var a = "Apple Book \"Grand Piano\" Piano"; 

而且我有一些像這樣的變量。

var b = "Piano"; 
var c = "Grand Piano"; 

如何從字符串a中刪除變量b或c。目前我一直在使用javascripts替換這樣的方法。

a = a.replace(b,"") 

這裏的問題是,它會刪除短語「大鋼琴」這個詞鋼琴,我只希望它刪除引號外的字鋼琴。我一直在嘗試使用RegExp來獲得某種解決方案,但一直無法弄清楚。我想我可能會將字符串拆分成一個數組,然後比較for循環中的變量a/b,然後刪除它們匹配的位置,然後將字符串放回到一起,不確定這是否是最好的方法。如果有人能指引我朝着正確的方向發展,我會非常樂意。

謝謝。

+1

我需要你的替換規則作一些澄清。你看到'格蘭特鋼琴'作爲一個詞(因爲引號)?所以'Apple'和'Book'是單獨的單詞。它是否正確?如果是這樣,你的語言是**不是常規的,你不能使用正則表達式。 – Halcyon

+0

您可以訂購要首先刪除的條款...也許。 –

+0

是的,大鋼琴被視爲一個詞,蘋果和書被分隔爲單詞。 – dcrui3

回答

2

something有點類似前幾天,你可以使其適應你的情況:

Piano(?!(?:[^"]*"[^"]*")*[^"]*"[^"]*$) 

JSFiddle demo

正則表達式基本上可以確保沒有奇數報價超前的字符串被替換。

你當然可以改變正則表達式來接受變量,而不僅僅是Piano

+0

輝煌。解決了我的問題。謝謝大家!謝謝。謝謝傑裏。 – dcrui3

+0

@ dcrui3不客氣:) – Jerry

0
var a = "Apple Book \"Grand Piano\" Piano Pear"; 
var b = "Piano"; 
var c = "Grand Piano"; 
var regexp = new RegExp('('+b+')|('+c+')', 'g'); 
a = a.replace(regexp, ''); 

你需要同時做所有的替代品,與匹配您需要排除一切正則表達式。 如果需要,請在將它們添加到RegExp之前確保將字符串轉義。

1

使用一個簡單的解析器:

var words = []; 
var string = "Apple Book \"Grand Piano\" Piano"; 
var remove_word = "Piano"; 

// -- tokenize input -- 

var i, char, looking_for_quote = false, word = ""; 
for (i = 0; i < string.length; i += 1) { 
    char = string[i]; 
    if (char === " " && looking_for_quote === false) { 
     words.push(word); 
     word = ""; 
    } else if (char === "\"" && looking_for_quote === false) { 
     looking_for_quote = true; 
    } else if (char === "\"" && looking_for_quote === true) { 
     looking_for_quote = false; 
    } else { 
     word += char; 
    } 
} 
words.push(word); // dont forget the last word 

console.log(words); // gives ["Apple", "Book", "Grand Piano", "Piano"] 

// -- remove words -- 

while (words.indexOf(remove_word) !== -1) { 
    words.splice(words.indexOf(remove_word), 1); 
} 

// reassemble output string 

var out = [] 
for (i = 0; i < words.length; i += 1) { 
    word = words[i]; 
    if (word.indexOf(" ") !== -1) { 
     out.push("\"" + word + "\""); 
    } else { 
     out.push(word); 
    } 
} 
console.log(out.join(" ")); // 'Apple Book "Grand Piano"' 
+0

這也很完美,但對於簡單的一線解決方案,我與傑瑞的答案一起去了。感謝您這樣做。 – dcrui3