鑑於這樣的文字:正則表達式來檢測嵌套區域
[start block1]
[end block1]
lorem
[start block2]
ipsum
[start block2_1]
[end block2_1]
dolor
[end block2]
是否有可能用一個正則表達式不匹配block2_1塊1 &塊2。
當然,我們不能依賴塊的名稱,而只能依賴嵌套在另一個塊中的事實。
鑑於這樣的文字:正則表達式來檢測嵌套區域
[start block1]
[end block1]
lorem
[start block2]
ipsum
[start block2_1]
[end block2_1]
dolor
[end block2]
是否有可能用一個正則表達式不匹配block2_1塊1 &塊2。
當然,我們不能依賴塊的名稱,而只能依賴嵌套在另一個塊中的事實。
試試這個:
\[start (\w+)\].*?\[end \1\]
只要你不重複任何塊名稱,你應該罰款。 \1
將匹配你已經開始的塊的名稱,並捕獲任何內部的東西。如果你的風格不支持它(如JavaScript),請確保使用點全部選項(或單行),/s
或[\s\S]*
黑客。
在PHP中,使用此代碼:
preg_match_all('/\[start (\w+)\].*?\[end \1\]/s', $str, $matches);
然後,您就可以輕鬆搞定的名字:
$area_names = $matches[1];
這是一個愚蠢的縮小版本,但是就像我說的如果你不依賴塊的名字,這應該是足夠的信息來解決這個問題... – 2011-05-18 09:13:39
所以永遠不會有輸入像:'[start block1] ... [start block1] ... [end bl ock1] ... [end block1]'(用相同的標籤嵌套)? – 2011-05-18 09:27:26