正則表達式(進階篇)


后向引用  分組進階

分組標號

使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。

\b(\w+)\b\s+\1\b   //表示重復的兩個單詞

\1    //表示第一個分組的東西

?:    //可以剝奪對分組權利的分配

 

分組捕獲

(exp)    //創建一個分組,捕獲文本到自動命名的分組里

(?<name>exp)或者(?'name'exp)    //創建一個命名的分組,捕獲文本到name名稱的分組里

(?:exp)    //匹配exp,不捕獲也不給分組分配編號

 

零寬斷言和負向零寬斷言

 (?=exp)     //匹配表達式前邊的位置//例如  \b\w+(?=ing\b)  匹配ing結尾的單詞   breaking popping  則會匹配到break和popp

 (?<=exp)     //匹配表達式后邊的位置//例如  \b(?<=re)\w+\b  匹配re開頭的單詞  reference和rebook 則會匹配ference和book

 (?!exp)     //匹配表達式前邊的位置//例如  \b\w+(?=ing\b)  匹配不以ing結尾的單詞

 (?<!exp)     //匹配表達式后邊的位置//例如  \b(?<=re)\w+\b  匹配不以re開頭的單詞

 

 注釋

 (?#comment)    //進行注釋  2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)

 

貪婪與懶惰

當正則表達式中包含能接受重復的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。以這個表達式為例:a.*b,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱為貪婪匹配。

有時,我們更需要懶惰匹配,也就是匹配盡可能少的字符。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它后面加上一個問號?。這樣.*?就意味着匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復。

注意定義懶惰為:使整個匹配成功的前提下使用最少的重復

 

處理選項

上邊的耐心看完意思其實就是igm這仨字母

平衡組和遞歸匹配

看到這里已經到了最后一個概念了,這個概念肯定相對陌生很多。

舉個例子((1+2+3)*(3+5)/(2+1+(3+3)/2))

這里邊有好多的相對的括號,那么可以說他們互相平衡了。就稱之為平衡組,

 運用前邊學的給分組命名的知識,那么希望一個分組開始一個結束的話,那么就一個命名的分組在結束時給一個負號的分組命名推出,這樣就可以達到平衡

    • (?'group')           //把捕獲的內容命名為group,並壓入堆棧(Stack)
    • (?'-group')                 //從堆棧上彈出最后壓入堆棧的名為group的捕獲內容,如果堆棧本來為空,則本分組的匹配失敗
    • (?(group)yes|no)    //如果堆棧上存在以名為group的捕獲內容的話,繼續匹配yes部分的表達式,否則繼續匹配no部分

 

 沒有提到的知識點

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM