2011-05-18 48 views
1

鑑於這樣的文字:正則表達式來檢測嵌套區域

[start block1] 
[end block1] 
lorem 
[start block2] 
ipsum 
[start block2_1] 
[end block2_1] 
dolor 
[end block2] 

是否有可能用一個正則表達式不匹配block2_1塊1 &塊2。

當然,我們不能依賴塊的名稱,而只能依賴嵌套在另一個塊中的事實。

+0

這是一個愚蠢的縮小版本,但是就像我說的如果你不依賴塊的名字,這應該是足夠的信息來解決這個問題... – 2011-05-18 09:13:39

+1

所以永遠不會有輸入像:'[start block1] ... [start block1] ... [end bl ock1] ... [end block1]'(用相同的標籤嵌套)? – 2011-05-18 09:27:26

回答

3

試試這個:

\[start (\w+)\].*?\[end \1\] 

只要你不重複任何塊名稱,你應該罰款。 \1將匹配你已經開始的塊的名稱,並捕獲任何內部的東西。如果你的風格不支持它(如JavaScript),請確保使用點全部選項(或單行),/s[\s\S]*黑客。

在PHP中,使用此代碼:

preg_match_all('/\[start (\w+)\].*?\[end \1\]/s', $str, $matches); 

然後,您就可以輕鬆搞定的名字:

$area_names = $matches[1]; 

工作例如:http://ideone.com/OsbSt

+0

這匹配一切,但lorem – 2011-05-18 09:12:49

+0

@Paté - lorem不在塊內。也許我沒有正確理解這個問題 - 你期待什麼?試着編輯這個問題並解釋一下,以及你使用的是什麼語言...... – Kobi 2011-05-18 09:14:01

+1

這也是我的回答,如果我沒有被「當然我們不能依賴這個塊的名字......」聲明。我根本不知道這個解決方案是否適用於(稀缺)規範。 – jensgram 2011-05-18 09:15:20