后向引用 分組進階
分組標號
使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為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部分
沒有提到的知識點