2010-12-06 76 views
0

我想寫一個正則表達式的平衡支架結構,如的JavaScript更換爲同樣的結構{... {..} ...}

{...}{... {..}...}{...{..{..}...}..{..}...}其中...指任何文本,它沒有「 {」或 '}' 字符

如果我這樣做:

 
    txt.replace(/\{[\s\S]+?}/g, function(s){return "_"+s+"_";}) 

第一}將被視爲結束的比賽,所以 { { } }將成爲_{ { }_ }

我想正則表達式將其轉換爲_{ { } }_

PS:在function(s)部分是不是從真正的代碼,只是舉例
PPS:我想用正則表達式,如果能夠做到這一點。
PPPS:的「{」包含在文本括號是有限的,以最高級別的3或4通常

UPDATE: 感謝的意見,讓我們限制嵌套括號的數量爲3。因此:

{ { { .. } .. { .. } } .. { .. } }

+5

如果你知道會有多少個大括號,你可以這樣做。如果不是,正則表達式不能這樣做。 – Gabe 2010-12-06 03:33:18

+0

如果存在帶支撐的字符串,該怎麼辦? – 2010-12-06 03:34:03

+4

根據定義,未知/可變數量的平衡括號通常不足以由正則表達式處理。 :) – deceze 2010-12-06 03:34:37

回答

2

感謝的意見,讓我們限制嵌套括號的數量爲3

OK,給人的東西,我們可以用正則表達式做。 (有像Perl或Python中的「擴展」正則表達式這樣的東西,可以匹配任意嵌套的大括號,通過使用稱爲「反向引用」。我不知道Javascript的「正則表達式」是否支持這些)

我們建立了正則表達式。

首先,讓我們弄清楚什麼用沒有嵌套括號塊的樣子:

[^{}]* 

OK,這很簡單。任何數量的非大括號字符。 :)

一個用大括號的一個層次構建,因此,看起來像

{[^{}]*} 

,因爲我們想在開始和結束括號,和其他地方。

高達2層的情況如何?

那麼,我們在開始和結束時仍然有大括號,我們的內容可以是「任意數量的數據塊,每個數據塊都有0或1級大括號」。因此,我們通過將|(這樣我們匹配一個或另一個)加入這兩個表達式並放在括號中(因爲我們希望將它作爲一個整體來對待),將「0或1級別的大括號​​」放在一起單位),然後*表示「我們剛剛在括號中定義的任何數量的這個東西」。然後大括號圍繞整個事情。這給了:

{({[^{}]*}|[^{}]*)*} 
    ^^^^^^^^ ^^^^^^ 
exp. for exp. for 
1 level 0 levels 

3個級別的括號被留作練習。 :)提示:我們應用相同的邏輯 - 大括號包含任意數量的塊,每個大塊最多有2級大括號。

2

正則表達式無法將平衡文本與任意級別的嵌套匹配。至少,並非沒有非正規的擴展。

但是,如果嵌套的數量有限,並且您不介意這個問題的脆弱和頑固的解決方案,那麼您可以使它們工作。

/{([^{}]*{[^{}]*})*[^{}]*}/ 

將對陣嵌套括號的一個水平,它應該是(相對)直截了當地延伸到嵌套您需要的級別數。