博客專欄

EEPW首頁 > 博客 > HTML5培訓之平衡組/遞歸匹配詳解及詳解

HTML5培訓之平衡組/遞歸匹配詳解及詳解

發(fā)布人:only1 時間:2020-09-04 來源:工程師 發(fā)布文章

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

為了避免(和\(把你的大腦徹底搞糊涂,我們還是用尖括號代替圓括號吧?,F(xiàn)在我們的問題變成了如何把xxaa>yy這樣的字符串里,最長的配對的尖括號內的內容捕獲出來?  

這里需要用到以下的語法構造:  

(?'group')把捕獲的內容命名為group,并壓入堆棧(Stack)  

(?'-group')從堆棧上彈出最后壓入堆棧的名為group的捕獲內容,如果堆棧本來為空,則本分組的匹配失敗  

(?(group)yes|no)如果堆棧上存在以名為group的捕獲內容的話,繼續(xù)匹配yes部分的表達式,否則繼續(xù)匹配no部分  

(?!)零寬負向先行斷言,由于沒有后綴表達式,試圖匹配總是失敗  

如果你不是一個程序員(或者你自稱程序員但是不知道堆棧是什么東西),你就這樣理解上面的三種語法吧:第一個就是在黑板上寫一個"group",第二個就是從黑板上擦掉一個"group",第三個就是看黑板上寫的還有沒有"group",如果有就繼續(xù)匹配yes部分,否則就匹配no部分。我們需要做的是每碰到了左括號,就在壓入一個"Open",每碰到一個右括號,就彈出一個,到了最后就看看堆棧是否為空--如果不為空那就證明左括號比右括號多,那匹配就應該失敗。正則表達式引擎會進行回溯(放棄最前面或最后面的一些字符),盡量使整個表達式得到匹配。  

<#最外層的左括號  

[^<>]*#最外層的左括號后面的不是括號的內容  

(  

(  

(?'Open'<)#碰到了左括號,在黑板上寫一個"Open"  

[^<>]*#匹配左括號后面的不是括號的內容  

)+  

(  

(?'-Open'>)#碰到了右括號,擦掉一個"Open"  

[^<>]*#匹配右括號后面不是括號的內容  

)+  

)*  

(?(Open)(?!))#在遇到最外層的右括號前面,判斷黑板上還有沒有沒擦掉的"Open";如果還有,則匹配失敗  

>#最外層的右括號  

平衡組的一個最常見的應用就是匹配HTML,下面這個例子可以匹配嵌套的標簽:]*>[^<>]*(((?'Open']*>)[^<>]*)+((?'-Open')[^<>]*)+)*(?(Open)(?!))  

上邊已經描述了構造正則表達式的大量元素,但是還有很多沒有提到的東西。下面是一些未提到的元素的列表,包含語法和簡單的說明。你可以在網上找到更詳細的參考資料來學習它們--當你需要用到它們的時候。如果你安裝了MSDNLibrary,你也可以在里面找到.net下正則表達式詳細的文檔。這里的介紹很簡略,如果你需要更詳細的信息,而又沒有在電腦上安裝MSDNLibrary,可以查看關于正則表達式語言元素的MSDN在線文檔。  

\a報警字符(打印它的效果是電腦嘀一聲)  

\b通常是單詞分界位置,但如果在字符類里使用代表退格  

\t制表符,Tab  

\r回車  

\v豎向制表符  

\f換頁符  

\n換行符  

\eEscape  

\0nnASCII代碼中八進制代碼為nn的字符  

\xnnASCII代碼中十六進制代碼為nn的字符  

\unnnnUnicode代碼中十六進制代碼為nnnn的字符  

\cNASCII控制字符。比如\cC代表Ctrl+C  

\A字符串開頭(類似^,但不受處理多行選項的影響)  

\Z字符串結尾或行尾(不受處理多行選項的影響)  

\z字符串結尾(類似$,但不受處理多行選項的影響)  

\G當前搜索的開頭  

\p{name}Unicode中命名為name的字符類,例如\p{IsGreek}  

(?>exp)貪婪子表達式  

(?-exp)平衡組  

(?im-nsx:exp)在子表達式exp中改變處理選項  

(?im-nsx)為表達式后面的部分改變處理選項  

(?(exp)yes|no)把exp當作零寬正向先行斷言,如果在這個位置能匹配,使用yes作為此組的表達式;否則使用no  

(?(exp)yes)同上,只是使用空表達式作為no  

(?(name)yes|no)如果命名為name的組捕獲到了內容,使用yes作為表達式;否則使用no  

(?(name)yes)同上,只是使用空表達式作為no  

以上就是關于扣丁學堂HTML5培訓之平衡組和遞歸匹配的詳細介紹,最后想要工作不累就要不斷的提升自己的技能,想要快速學習HTML5培訓技能到扣丁學堂學習吧??鄱W堂還有名師錄制的HTML5視頻教程供學員觀看學習,想要HTML5培訓視頻教程的小伙伴快咨詢我們的專業(yè)老師索要吧??鄱W堂H5技術交流群:751662650。


*博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



關鍵詞:

相關推薦

技術專區(qū)

關閉