HTML5培訓(xùn)之平衡組/遞歸匹配詳解及詳解
有時我們需要匹配像(100*(50+15))這樣的可嵌套的層次性結(jié)構(gòu),這時簡單地使用\(.+\)則只會匹配到最左邊的左括號和最右邊的右括號之間的內(nèi)容(這里我們討論的是貪婪模式,懶惰模式也有下面的問題)。假如原來的字符串里的左括號和右括號出現(xiàn)的次數(shù)不相等,比如(5/(3+2))),那我們的匹配結(jié)果里兩者的個數(shù)也不會相等。有沒有辦法在這樣的字符串里匹配到最長的,配對的括號之間的內(nèi)容呢?
為了避免(和\(把你的大腦徹底搞糊涂,我們還是用尖括號代替圓括號吧。現(xiàn)在我們的問題變成了如何把xxaa>yy這樣的字符串里,最長的配對的尖括號內(nèi)的內(nèi)容捕獲出來?
這里需要用到以下的語法構(gòu)造:
(?'group')把捕獲的內(nèi)容命名為group,并壓入堆棧(Stack)
(?'-group')從堆棧上彈出最后壓入堆棧的名為group的捕獲內(nèi)容,如果堆棧本來為空,則本分組的匹配失敗
(?(group)yes|no)如果堆棧上存在以名為group的捕獲內(nèi)容的話,繼續(xù)匹配yes部分的表達式,否則繼續(xù)匹配no部分
(?!)零寬負向先行斷言,由于沒有后綴表達式,試圖匹配總是失敗
如果你不是一個程序員(或者你自稱程序員但是不知道堆棧是什么東西),你就這樣理解上面的三種語法吧:第一個就是在黑板上寫一個"group",第二個就是從黑板上擦掉一個"group",第三個就是看黑板上寫的還有沒有"group",如果有就繼續(xù)匹配yes部分,否則就匹配no部分。我們需要做的是每碰到了左括號,就在壓入一個"Open",每碰到一個右括號,就彈出一個,到了最后就看看堆棧是否為空--如果不為空那就證明左括號比右括號多,那匹配就應(yīng)該失敗。正則表達式引擎會進行回溯(放棄最前面或最后面的一些字符),盡量使整個表達式得到匹配。
<#最外層的左括號
[^<>]*#最外層的左括號后面的不是括號的內(nèi)容
(
(
(?'Open'<)#碰到了左括號,在黑板上寫一個"Open"
[^<>]*#匹配左括號后面的不是括號的內(nèi)容
)+
(
(?'-Open'>)#碰到了右括號,擦掉一個"Open"
[^<>]*#匹配右括號后面不是括號的內(nèi)容
)+
)*
(?(Open)(?!))#在遇到最外層的右括號前面,判斷黑板上還有沒有沒擦掉的"Open";如果還有,則匹配失敗
>#最外層的右括號
平衡組的一個最常見的應(yīng)用就是匹配HTML,下面這個例子可以匹配嵌套的標(biāo)簽:]*>[^<>]*(((?'Open']*>)[^<>]*)+((?'-Open')[^<>]*)+)*(?(Open)(?!))
上邊已經(jīng)描述了構(gòu)造正則表達式的大量元素,但是還有很多沒有提到的東西。下面是一些未提到的元素的列表,包含語法和簡單的說明。你可以在網(wǎng)上找到更詳細的參考資料來學(xué)習(xí)它們--當(dāng)你需要用到它們的時候。如果你安裝了MSDNLibrary,你也可以在里面找到.net下正則表達式詳細的文檔。這里的介紹很簡略,如果你需要更詳細的信息,而又沒有在電腦上安裝MSDNLibrary,可以查看關(guān)于正則表達式語言元素的MSDN在線文檔。
\a報警字符(打印它的效果是電腦嘀一聲)
\b通常是單詞分界位置,但如果在字符類里使用代表退格
\t制表符,Tab
\r回車
\v豎向制表符
\f換頁符
\n換行符
\eEscape
\0nnASCII代碼中八進制代碼為nn的字符
\xnnASCII代碼中十六進制代碼為nn的字符
\unnnnUnicode代碼中十六進制代碼為nnnn的字符
\cNASCII控制字符。比如\cC代表Ctrl+C
\A字符串開頭(類似^,但不受處理多行選項的影響)
\Z字符串結(jié)尾或行尾(不受處理多行選項的影響)
\z字符串結(jié)尾(類似$,但不受處理多行選項的影響)
\G當(dāng)前搜索的開頭
\p{name}Unicode中命名為name的字符類,例如\p{IsGreek}
(?>exp)貪婪子表達式
(?-exp)平衡組
(?im-nsx:exp)在子表達式exp中改變處理選項
(?im-nsx)為表達式后面的部分改變處理選項
(?(exp)yes|no)把exp當(dāng)作零寬正向先行斷言,如果在這個位置能匹配,使用yes作為此組的表達式;否則使用no
(?(exp)yes)同上,只是使用空表達式作為no
(?(name)yes|no)如果命名為name的組捕獲到了內(nèi)容,使用yes作為表達式;否則使用no
(?(name)yes)同上,只是使用空表達式作為no
以上就是關(guān)于扣丁學(xué)堂HTML5培訓(xùn)之平衡組和遞歸匹配的詳細介紹,最后想要工作不累就要不斷的提升自己的技能,想要快速學(xué)習(xí)HTML5培訓(xùn)技能到扣丁學(xué)堂學(xué)習(xí)吧??鄱W(xué)堂還有名師錄制的HTML5視頻教程供學(xué)員觀看學(xué)習(xí),想要HTML5培訓(xùn)視頻教程的小伙伴快咨詢我們的專業(yè)老師索要吧??鄱W(xué)堂H5技術(shù)交流群:751662650。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。