.net c# 正規表示式 平衡組/遞迴匹配

巴扎黑
發布: 2016-12-19 16:32:11
原創
1622 人瀏覽過

.net c# 正規表示式平衡組/遞迴匹配 

平衡組/遞歸匹配 

這裡介紹的平衡組語法是由.Net Framework支援的;其它語言/庫不一定支援此功能,或支援此功能但需要使用不同的語法。

有時我們需要匹配像( 100 * ( 50 + 15 ) )這樣的可嵌套的層次性結構,這時簡單地使用(.+)則只會匹配到最左邊的左括號和最右邊的右括號之間的內容(這裡我們討論的是貪婪模式,懶惰模式也有下面的問題)。假如原來的字串裡的左括號和右括號出現的次數不相等,例如( 5 / ( 3 + 2 ) ) ),那我們的配對結果裡兩者的個數也不會相等。有沒有辦法在這樣的字串裡配對到最長的,配對的括號之間的內容呢?

為了避免(和(把你的大腦徹底搞糊塗,我們還是用尖括號代替圓括號吧。現在我們的問題變成瞭如何把xx aa> yy這樣的字符串裡,最長的配對的尖括號內的內容捕獲出來? (?'-group') 從堆疊上彈出最後壓入堆疊的名為group的捕獲內容,如果堆疊本來為空,則本分組的匹配失敗 
(?(group)yes|no) 如果堆疊上存在以名為group的捕獲內容的話,繼續匹配yes部分的表達式,否則繼續匹配no部分 
(?!) 零寬負向先行斷言,由於沒有後綴表達式,試圖匹配總是失敗 
如果你不是一個程序員(或者你自稱程式設計師但是不知道堆疊是什麼東西),你就這樣理解上面的三種語法吧:第一個就是在黑板上寫一個"group",第二個就是從黑板上擦掉一個"group",第三個就是看黑板上寫的還有沒有"group",如果有就繼續匹配yes部分,否則就匹配no部分。入一個"Open",每碰到一個右括號,就彈出一個,到了最後就看看堆疊是否為空——如果不為空那就證明左括號比右括號多,那匹配就應該失敗。 



複製代碼 
]*                #最外層的左括號後面的不是括號的內容 
    ( 
        ( 
                [^]*       #符合左括號後面的則不是  的內容 
        )+ 
        ( 
               [^]*        #右括號後不是括號的內容 
        )+ 
   ) * 
    (?(Open)(?!))         #在遇到最外層的右括號前面,判斷黑板上還有沒有沒擦掉的"Open";如果     #最外層的右括號 
複製程式碼 


平衡組的一個最常見的應用就是匹配HTML,下面這個例子可以匹配嵌套的

標籤: 



]*>[^ ]*(((?'Open'
]*>)[^]*)+((?'-Open'
)[^]*)+)* (?(Open)(?!))

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板