2016-02-20 34 views
0

我有一段我想從中抽取字符串的段落由雙方括號"[[" ... "]]"包圍。括號內有一些包含條的字符串|我想省略這些。我創建了以下正則表達式\[\[([^|]+?)\]\]/g這個正則表達式完美無瑕地工作,但它返回字符串與周圍的方括號。有類似的問題可以通過使用str.split來解決,但是我匹配200個以上的字符串,它可能會降低性能,因此我只會喜歡正則表達式。忘了提及這是一個很長的段落,我需要所有的匹配,因此我指定/ g標誌來獲得所有匹配的數組。如何在沒有令牌的情況下匹配兩個令牌之間的字符串

+0

你去優化前,測量與1000串的解決方案。如果速度慢,開始考慮優化 - 直到那時,找到更好的方法來做:-) – Amit

+0

JS沒有向後看。也許是一個捕獲組? – Oriol

+1

你的正則表達式適合我。請使用正則表達式顯示您正在使用的JS。結果如何返回取決於您使用哪種正則表達式方法以及是否指定「g」標誌。 – nnnnnn

回答

4

你的正則表達式看起來不錯。我認爲你只是看着結果的錯誤部分。當你得到一個匹配時,Regex.exec()返回一個數組。索引0包含完整匹配,例如"[[value]]",並且後面的索引包含隱藏在內的每個子匹配,例如, "value"。所以看看match[1]而不是match[0]

要處理多個匹配,加上g標誌,並使用while循環運行Regex.exec()多次 - 這將返回一個結果陣列對於每個連續的比賽,直到不再發現匹配,並返回null。您可以將每個結果推送到一個數組中。你的正則表達式仍然是一樣的壽。

var inputs = [ 
 
    "foo [[value]] bar", 
 
    "foo [[val1|val2]] bar", 
 
    "foo [[value1]] bar [[value|2]] fizz [[value3]] buzz", 
 
]; 
 

 
console.clear(); 
 
for(var i = 0; i < inputs.length; i++) { 
 

 
    var re = /\[\[([^|]+?)\]\]/g; 
 
    var match; 
 
    var matches = []; 
 
    while((match = re.exec(inputs[i])) !== null) { 
 
     matches.push(match[1]); 
 
    } 
 

 
    console.log(inputs[i]); 
 
    console.log(matches); 
 
}