版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、正則表達式和字符串處理第一章正則表達式概述正則表達式(Regular Expression)起源于人類神經(jīng)系統(tǒng)的研究。正則表達式的定義有以下幾種:l用某種模式去匹配一類字符串的公式,它主要是用來描述字符串匹配的工具。l描述了一種字符串匹配的模式??梢杂脕頇z查字符串是否含有某種子串、將匹配的子串做替換或者從中取出符合某個條件的子串等。l由普通字符(a-z)以及特殊字符(元字符)組成的文字模式,正則表達式作為一個模版,將某個字符模式與所搜索的字符串進行匹配。l用于描述某些規(guī)則的的工具。這些規(guī)則經(jīng)常用于處理字符串中的查找或替換字符串。也就是說正則表達式就是記錄文本規(guī)則的代碼。l用一個字符串來描述一個
2、特征,然后去驗證另一個字符串是否符合這個特征。以上這些定義其實也就是正則表達式的作用。第二章正則表達式基礎理論這些理論將為編寫正則表達式提供法則和規(guī)范,正則表達式主要包括以下基礎理論:l元字符l字符串l字符轉義l反義l限定符l替換l分組l反向引用l零寬度斷言l匹配選項l注釋l優(yōu)先級順序l遞歸匹配21元字符在正則表達式中,元字符(Metacharacter)是一類非常特殊的字符,它能夠匹配一個位置或字符集合中的一個字符,如:、w等。根據(jù)功能,元字符可以分為兩種類型:匹配位置的元字符和匹配字符的元字符。211匹配位置的元字符包括:、$、和b。其中(脫字符號)和$(美元符號)都匹配一個位置,分別匹配
3、行的開始和結尾。比如,string匹配以string開頭的行,string$匹配以string結尾的行。string$匹配以string開始和結尾的行。單個$匹配一個空行。單個匹配任意行。b匹配單詞的開始和結尾,如:bstr匹配以str開始的單詞,但b不匹配空格、標點符號或換行符號,所以,bstr可以匹配string、string fomat等單詞。bstr正則表達式匹配的字符串必須以str開頭,并且str以前是單詞的分界處,但此正則表達式不能限定str之后的字符串形式。以下正則表達式匹配以ing結尾的字符串,如string、This is a string等Ingb正則表達式ingb匹配的字
4、符串必須以ing結尾,并且ing后是分界符,以下正則表達式匹配一個完整的單詞:bstringb。2.1.2匹配字符的元字符匹配字符的元字符有7個:.(點號)、w、W、s、S、d和D。其中點號匹配除換行之外的任意字符;w匹配單詞字符(包括字母、漢字、下劃線和數(shù)字);W匹配任意非單詞字符、s匹配任意的空白字符,如空格、制表符、換行等;S匹配任意的非空白字符;d匹配任意數(shù)字字符;D匹配任意的非數(shù)字字符。如:.$匹配一個非空行,在該行中可以包含除了換行符以外的任意字符。w$匹配一個非空行,并且該行中只能包含字母、數(shù)字、下劃線和漢字中的任意字符。bawwwwwwb匹配以字母a開頭長度等于7的任意單詞ba
5、wwwdddDb匹配以字母a開頭后面有3個字符三個數(shù)字和1個非數(shù)字字符長度等于8的單詞2.2字符類字符類是一個字符集合,如果該字符集合中的任何一個字符被匹配,則它會找到該匹配項。字符類可以在(方括號)中定義。如:012345可以匹配數(shù)字0到5中的任意一個。可以匹配HTML標簽中的H1到H6。Jjack可以匹配字符串Jack或jack。但是,由于表達式0123456789書寫非常不方便,連字符(-)便應用而生,0-9等價于0123456789。a-z匹配任何小寫字母,A-Z匹配任意大寫字母。如果要在字符類中包含連字符,則必須包含在第一位,如:-a表示表達式匹配-或者a。在字符類中如果是字符類的第
6、一個字符表示否定該字符串,也就是匹配該字符串外的任意字符,如:abc匹配除了abc以外的任意字符,-匹配除了連字符以外的任意字符,ab匹配a之后不是b的字符串。表2-1常用的字符類字符或表達式說明w匹配單詞字符(包括字母、數(shù)字、下劃線和漢字)W匹配任意的非單詞字符(包括字母、數(shù)字、下劃線和漢字)s匹配任意的空白字符,如空格、制表符、換行符、中文全角空格等S匹配任意的非空白字符d匹配任意數(shù)字D匹配任意的非數(shù)字字符abc匹配字符集中的任何字符abc匹配除了字符集中包含字符的任意字符0-9a-z_A-Z_匹配任何數(shù)字、字母、下劃線。等同于wpname匹配name指定的命名字符類中的任何字符Pname
7、匹配除了name指定的命名字符類中之外的任何字符.匹配除了換行符號之外的任意字符0-9a-zA-Z_等同于W2.3字符轉義表2-2:常用的轉義字符表達式可匹配r, n代表回車和換行符t制表符代表 本身還有其他一些在后邊章節(jié)中有特殊用處的標點符號,在前面加 后,就代表該符號本身。比如:, $ 都有特殊意義,如果要想匹配字符串中 和 $ 字符,則表達式就需要寫成 和 $。表達式可匹配匹配 符號本身$匹配 $ 符號本身.匹配小數(shù)點(.)本身2.4反義在使用正則表達式時,如果需要匹配不在字符類指定的范圍內(nèi)的字符時,可以使用反義規(guī)則。其實我們已經(jīng)使用過反義表達式,如W、S、D、abc等。常用的反義表如下
8、:表2-3:常用的反義表達式字符或表達式說明W匹配任意不是字母,數(shù)字,下劃線,漢字的字符S匹配任意不是空白符的字符D匹配任意非數(shù)字的字符B匹配不是單詞開頭或結束的位置x匹配除了x以外的任意字符aeiou匹配除了aeiou這幾個字母以外的任意字符2.4限定符正則表達式的元字符一次只能匹配一個位置或一個字符,如果需要匹配零個一個或多個字符時,則需要使用限定符。限定符用于指定允許特定字符或字符集自身重復出現(xiàn)的次數(shù)。如n表示出現(xiàn)n次;n,表示重復至少n次;n,m表示至少出現(xiàn)n次最多m次。常用限定符如下表:表2-4:常用限定符字符描述*匹配前面的子表達式零次或多次。例如,zo* 能匹配 z 以及 zoo
9、。 * 等價于0,。+匹配前面的子表達式一次或多次。例如,zo+ 能匹配 zo 以及 zoo,但不能匹配 z。+ 等價于 1,。?匹配前面的子表達式零次或一次。例如,do(es)? 可以匹配 do 或 does 中的do 。? 等價于 0,1。nn是一個非負整數(shù)。匹配確定的n次。例如,o2 不能匹配 Bob 中的 o,但是能匹配 food 中的兩個 o。n,n是一個非負整數(shù)。至少匹配n次。例如,o2, 不能匹配 Bob 中的 o,但能匹配 foooood 中的所有 o。o1, 等價于 o+。o0, 則等價于 o*。n,mm和n均為非負整數(shù),其中n=m。最少匹配n次且最多匹配m次。劉, o1,3
10、 將匹配 fooooood 中的前三個 o。o0,1 等價于 o?。請注意在逗號和兩個數(shù)之間不能有空格。*?盡可能少的使用重復的第一個匹配+?盡可能少的使用重復但至少使用一次?如果有可能使用零次重復或一次重復。n?等同于nn,?盡可能少的使用重復但至少重復n次n,m?介于n次和m次之間,盡可能少的使用重復。2.5貪婪、惰性和支配性匹配惰性匹配:先看字符串中的第一個字母是不是一個匹配,如果單獨一個字符還不夠就讀入下一個字符,如果還沒有發(fā)現(xiàn)匹配,就不斷地從后續(xù)字符中讀取,只道發(fā)現(xiàn)一個合適的匹配,然后開始下一次的匹配。貪婪匹配:先看整個字符串是不是一個匹配,如果沒有發(fā)現(xiàn)匹配,它去掉字符串中最后一個字
11、符并再次嘗試,如果還沒有發(fā)現(xiàn)匹配,那么再次去掉最后一個字符,這個過程會一直重復直到發(fā)現(xiàn)一個匹配或字符串不剩一個字符為止。支配性匹配:只嘗試匹配整個字符串,如果整個字符串不能產(chǎn)生一個匹配,則不再進行嘗試。我們普通的字符類均是貪婪匹配,如果在字符類后加個問號(?)則表示懶惰匹配,要成為支配性匹配則在懶惰匹配后加個問號(?).2.6替換正則表達式0d2-d8和0d3-d7分別匹配區(qū)號為3位和4位的固定電話號碼,如果需要同時匹配區(qū)號為3位和4位的固定電話號碼,可以使用替換滿足這一需求。最簡單的替換是使用豎線(|)表示。以下表達式匹配了區(qū)號為3位號碼為8位和區(qū)號為4位號碼為7位的的電話號碼,區(qū)號和號碼均
12、使用-連接,0d2-d8|0d3-d7表2-5常用替換字符或表達式說明|匹配豎線(|)左側或右側(?(表達式)yes|no)表達式要么與yes部分匹配要么與no部分匹配,其中no部分可以省略。(?(name)yes|no)以name命名的字符串要么與yas部分匹配,要么與no部分pp,其中no部分可以省略2.7分組分組又稱為子表達式,即把一個正則表達式的全部或部分分成一個或多個組。其中分組使用圓括號(),分組后把圓括號中的表達式看做一個整體來處理,比如:(abc)1,2表示abc出現(xiàn)一次或兩次的字符串,其中把abc看做一個整體來進行匹配。2.8后向引用當一個正則表達式被分組后,每一個組將自動被
13、賦予一個組號,該組號可以代表該組的表達式。其中,組號的編制規(guī)則為:從左到右,以分組的左括號為標志,第一個組號為1,第二個分組號為2,以此類推。如:(A?(B?(C?)將產(chǎn)生3個組號,第一組為:(A?(B?(C?);第二組為:(B?(C?);第三組為:(C?)。反向引用提供了查找重復字符組的方便方法,反向引用可以使用數(shù)字命名(默認名稱)的組號,也可以使用指定命名的組號。比如:b(w)1b匹配兩個字符一樣的單詞,此表達式和b(w)wb不一樣,后者兩個字符可以不一樣。再看,b(w)(d)12b,匹配一個字符和一個數(shù)字然后重復字符和數(shù)字。bw*(w+)1b匹配以至少兩個字符一樣結尾的單詞。b(w+)b
14、s+1b此正則表達式匹配的具體過程如下:a.表達式b(w+)b匹配一個單詞并且單詞的長度至少為1b.表達式s+匹配一個或多個空白字符c.表達式1將重復子表達式(w+)匹配的內(nèi)容,及匹配重復的單詞d.匹配單詞的結束位置。分組不僅可以使用數(shù)字作為組號,還可以使用自定義名稱作為組號。以下兩個正則表達式都是將分組后的子表達式w+命名為word.(?w+)(?wordw+)因此b(w+)bs+1b和以下正則表達式是等價的,都匹配重復的單詞:b(?w+)bs+kb表2-5后向引用說明表表達式說明數(shù)字使用數(shù)字命名的后向引用k使用指定命名的后向引用表2-6常用分組說明字符說明(expression)匹配字符串
15、expression,并將匹配的文本保存到自動命名的組里(? expression)匹配字符串expression,并將匹配的文本保存到以name命名的變量中,該名稱不能包含標點符號,不能以數(shù)字開頭。(?:expression)匹配字符串expression,不保存匹配的文本,也不分配組號(?!expression)匹配后面不是字符串expression的位置(?=expression)匹配字符串expression前面的位置(?=expression)匹配字符串expression后面的位置(?expression)只匹配expression一次2.9零寬度斷言元字符、b、$都匹配一個位置,
16、并且這個位置滿足一定條件。在此把滿足一個條件稱為斷言或零寬度斷言。正則表達式中零寬度斷言說明如下表:表2-6零寬度斷言字符(斷言)說明匹配行的開始位置$匹配行的結束位置A匹配必須出現(xiàn)在字符串的開頭Z匹配必須出現(xiàn)在字符串的結尾或字符串結尾處的換行符(n)前z匹配必須出現(xiàn)在字符串的結尾G匹配必須出現(xiàn)在上個匹配結束的地方b匹配單詞的開始或結束的位置B匹配不是單詞的開始或結束的位置表達式(?=expression)、(?!expression)、(?=expression)、和(?!expression)都是匹配一個位置。下面將詳細介紹表達式(?=expression)和(?=expression)。
17、(?=expression)又稱為零寬度正預測先行斷言,它斷言自身位置的前面能夠匹配表達式expression。以下正則表達式匹配以ed結尾的單詞的前面部分:bw+(?=edb)。(?=expression)又稱為零寬度正回顧后發(fā)斷言,它斷言自身位置的后面能夠匹配表達式expression,以下正則表達式匹配以an開頭的單詞的后面部分,即匹配單詞除了字符串a(chǎn)n之外的部分:(?=ban)w+b2.10負向零寬度斷言零寬度斷言只能指定或匹配一個位置,而負向零寬度斷言與零寬度斷言正好相反,它能指定或匹配不是一個位置,即所說的反義。特別是在匹配字符串中不包含指定的字符時,負向零寬度斷言特別有用,比如要
18、匹配斷言字符a之后不能是字符b的表達式為:bw*a(?!b)w*b因此該表達式匹配一個單詞,并且這個包含字符a并且a后面不是緊隨著b表達式(?!expression)稱為負向零寬度斷言,它斷言自身位置后不能包含expression。以下正則表達式匹配一個z字符串,字符串前三位為字符并且后邊不是緊隨著數(shù)字:bw3 (?!d+);表達式(?!expression)稱為零寬度回顧后發(fā)斷言,它斷言自身位置的前面不能匹配字符串expression。以下表達式匹配不以數(shù)字開頭、并且字符串中只包含大寫字母、小寫字母或下劃線。(?!d+) a-z-A-Z+2.11匹配選項匹配選項可以指定正則表達式匹配中的行為
19、,如忽略大小寫、處理多行、處理單行、從右到左開始匹配等。常用的匹配選項如下:表2-7常用匹配選項RegexOptions枚舉值內(nèi)聯(lián)標志簡單說明ExplicitCapturen只有定義了命名或編號的組才捕獲IgnoreCasei不區(qū)分大小寫IgnorePatternWhitespacex消除模式中的非轉義空白并啟用由#標記的注釋。MultiLinem多行模式,其原理是修改了和$的含義SingleLines單行模式,和MultiLine相對應2.12優(yōu)先級正則表達式從左到右進行計算,并遵循優(yōu)先級順序,這與算術表達式非常類似。下表從最高到最低說明了各種正則表達式運算符的優(yōu)先級順序:表2-8:優(yōu)先級說
20、明運算符說明轉義符(), (?:), (?=), 括號和中括號*, +, ?, n, n, n,m限定符, $, anymetacharacter, anycharacter定位點和序列|替換字符的優(yōu)先級比替換運算符高,替換運算符允許“m|food”與“m”或“food”匹配。若要匹配“mood”或“food”,請使用括號創(chuàng)建子表達式,從而產(chǎn)生“(m|f)ood”。2.12遞歸匹配遞歸匹配在匹配具有嵌套結構的字符串時特別有效。比如算術表達式(1+2)*(3+4)具有嵌套結構,如果要使用正則表達式檢查該表達式是否正確,則可以使用遞歸匹配解決該問題。這里介紹的平衡組語法是由.Net Framewo
21、rk支持的;其它語言庫不一定支持這種功能,或者支持此功能但需要使用不同的語法。有時我們需要匹配像( 100 * ( 50 + 15 ) )這樣的可嵌套的層次性結構,這時簡單地使用(.+)則只會匹配到最左邊的左括號和最右邊的右括號之間的內(nèi)容(這里我們討論的是貪婪模式,懶惰模式也有下面的問題)。假如原來的字符串里的左括號和右括號出現(xiàn)的次數(shù)不相等,比如( 5 / ( 3 + 2 ) ) ),那我們的匹配結果里兩者的個數(shù)也不會相等。有沒有辦法在這樣的字符串里匹配到最長的,配對的括號之間的內(nèi)容呢?為了避免(和(把你的大腦徹底搞糊涂,我們還是用尖括號代替圓括號吧?,F(xiàn)在我們的問題變成了如何把xx aa aa yy這樣的字符串里,最長的配對的尖括號內(nèi)的內(nèi)容捕獲出來?這里需要用到以下的語法構造: (?group)把
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 手繪施工圖考試題及答案
- 攝影攝像考試試題及答案
- 涉藥作業(yè)實操考試題及答案
- 全國生物會考試題及答案
- 2026年深圳中考英語高頻考點精練試卷(附答案可下載)
- 2026年深圳中考物理力學專項提分試卷(附答案可下載)
- 2026年大學大二(口腔正畸學)口腔正畸方案設計實施綜合測試題及答案
- 2026年大學大二(建筑學)建筑構造設計綜合測試題及答案
- 2026年深圳中考生物克隆技術專項試卷(附答案可下載)
- 蘇州體育招聘題庫及答案
- 2026年河南農(nóng)業(yè)職業(yè)學院高職單招職業(yè)適應性考試參考題庫含答案解析
- 2026年揚州工業(yè)職業(yè)技術學院高職單招職業(yè)適應性測試參考題庫含答案解析
- 安全帽使用規(guī)范制度
- 2026國家電投集團蘇州審計中心選聘15人筆試模擬試題及答案解析
- 2026年桐城師范高等??茖W校單招職業(yè)技能考試題庫及答案1套
- 霧化吸入操作教學課件
- 2025年小學圖書館自查報告
- 【語文】廣東省佛山市羅行小學一年級上冊期末復習試卷
- 2025年醫(yī)療器械注冊代理協(xié)議
- 廣西壯族自治區(qū)職教高考英語學科聯(lián)考卷(12月份)和參考答案解析
- 新疆三校生考試題及答案
評論
0/150
提交評論