2011-01-20 50 views
2

說我有字符串Hello {{name}}, how are you doing today?我試圖從該字符串抓name。我們有/\{{2}[a-z0-9]*\}{2}/gi。問題是,它抓住{{name}}而不是name。沒有全局標誌,它工作正常,但我試圖讓每個單詞的實例在雙括號內,所以它不是很正確......我不是正則表達式專家,所以我希望有人能幫助我... ...一個(簡單的?)RegEx問題的全球非捕獲組

回答

4

最好的解決方案是使用lookaround斷言,以便{{}}不會被拾取,但JavaScript正則表達式不支持倒序,它只支持lookahead。

那麼一個選擇是你的文字放在一個捕獲組,並抓住裏面是什麼:

/\{{2}([a-z0-9]*)\}{2}/gi 

讓每一個捕捉,使RegExp對象與您正則表達式,並通過其exec()函數的結果迭代。例如:

var str = 'Hello {{name}}, how are you doing {{date}}?'; 
var re = /\{{2}([a-z0-9]*)\}{2}/gi; 
var words = []; 
var match; 

while (match = re.exec(str)) { 
    words.push(match[1]); 
} 

jsFiddle sample

或者像濃湯建議在他的評論,手動從比賽的陣列剝離出{{}}

+2

令人驚訝的對我,但是這並不工作,因爲OP說,因爲/ g標誌的。它基本上沒有區別。我想這是因爲JavaScript如何處理正則表達式;在Perl中它會正常工作。 – 2011-01-20 15:21:47

0

是啊如所提到的,模式匹配對2開閉括號是要走的途徑(假設名字不具有內本身在2號的連續的大括號,無論是開/關)

/\{{2}([a-z0-9]+)*\}{2}/gi