.net c# 正規表示式平衡組/遞迴匹配
平衡組/遞歸匹配
這裡介紹的平衡組語法是由.Net Framework支援的;其它語言/庫不一定支援此功能,或支援此功能但需要使用不同的語法。
有時我們需要匹配像( 100 * ( 50 + 15 ) )這樣的可嵌套的層次性結構,這時簡單地使用(.+)則只會匹配到最左邊的左括號和最右邊的右括號之間的內容(這裡我們討論的是貪婪模式,懶惰模式也有下面的問題)。假如原來的字串裡的左括號和右括號出現的次數不相等,例如( 5 / ( 3 + 2 ) ) ),那我們的配對結果裡兩者的個數也不會相等。有沒有辦法在這樣的字串裡配對到最長的,配對的括號之間的內容呢?
為了避免(和(把你的大腦徹底搞糊塗,我們還是用尖括號代替圓括號吧。現在我們的問題變成瞭如何把xx
(?(group)yes|no) 如果堆疊上存在以名為group的捕獲內容的話,繼續匹配yes部分的表達式,否則繼續匹配no部分
(?!) 零寬負向先行斷言,由於沒有後綴表達式,試圖匹配總是失敗
如果你不是一個程序員(或者你自稱程式設計師但是不知道堆疊是什麼東西),你就這樣理解上面的三種語法吧:第一個就是在黑板上寫一個"group",第二個就是從黑板上擦掉一個"group",第三個就是看黑板上寫的還有沒有"group",如果有就繼續匹配yes部分,否則就匹配no部分。入一個"Open",每碰到一個右括號,就彈出一個,到了最後就看看堆疊是否為空——如果不為空那就證明左括號比右括號多,那匹配就應該失敗。
複製代碼
]* #最外層的左括號後面的不是括號的內容
(
(
[^]* #符合左括號後面的則不是 的內容
)+
(
[^]* #右括號後不是括號的內容
)+
) *
(?(Open)(?!)) #在遇到最外層的右括號前面,判斷黑板上還有沒有沒擦掉的"Open";如果 #最外層的右括號
複製程式碼
平衡組的一個最常見的應用就是匹配HTML,下面這個例子可以匹配嵌套的