Java正則表達(dá)式基礎(chǔ)知識學(xué)習(xí)
2022-01-21點(diǎn)擊量:426
一、概述1.正則表達(dá)式是一個(gè)字符序列,用來描述文本的模式結(jié)構(gòu)的表達(dá)式,亦可看做一門“微型語言”。因此,尤其適用于文本處理。2.一個(gè)文本模式可能有多種正則表達(dá)式寫法,有的簡單清晰,有的快速但復(fù)雜,有的功能全面,有的兼容性好,要多多嘗試加以權(quán)衡。3.正則表達(dá)式是“文本內(nèi)匹配”。4.正則表達(dá)式的準(zhǔn)確性:匹配期望的文本,同時(shí)不匹配不期望的文本。比如,匹配三位數(shù),可使用\d{3},但這樣會匹配001這樣的數(shù),準(zhǔn)確的寫法應(yīng)是:[1-9]\d{2}5.匹配分析的思路最好采用“逐字符方式”。比如note匹配一個(gè)n緊接著一個(gè)o緊接著一個(gè)t緊接著一個(gè)e,而不是匹配單詞"note"。二、基本元素1.普通字符:除*,?,\,(,),[,],-,.,+,^,$,{,},以外的字符匹配它自身,比如a匹配a2.點(diǎn)號.:匹配任意不包括換行符的單個(gè)字符。比如,sa.可匹配sat,sa*,sa[等。3.字符組[characters]:匹配字符組中指定字符集合中的任意單個(gè)字符:比如[abc]將匹配a或b或c,ca[ptb]將匹配cap,cat或cab。4.排除性字符組[^characters]:匹配字符組中指定字符集合之外的任意單個(gè)字符:比如,[^abc]將匹配除了a,b,c之外的任意單個(gè)字符。ca[^ptb],將匹配caX的文本,除了cap,cat,cab,注意,這里是匹配一個(gè)非指定的字符,而不是不匹配。5.范圍字符組:[char1-char2]將匹配從char1到char2之間的任意單個(gè)字符(按照ASCII編碼)。比如,[a-z]匹配任意小寫字符;[A-Z]匹配任意大寫字符;[0-9]匹配任意數(shù)字;[a-zA-Z0-9]匹配任意大小寫字符或數(shù)字。6.特殊字符:凡是在正則式中具有特殊含義的字符,要匹配字符本身(將其作為普通文本)都必須使用反斜線\進(jìn)行轉(zhuǎn)義;通常需要轉(zhuǎn)義的字符有:.+*?{}[]()-\^$。比如,匹配.的正則式是\.,匹配\的正則式是\\,匹配(的正則式是\(;要匹配(ab)的正則表達(dá)式是\(ab\);要匹配a?的表達(dá)式是a\?;a?將匹配空或單個(gè)a。7.匹配空白字符:\f換頁\n換行\(zhòng)r回車\t制表符\v垂直制表符\s匹配任意空白符,包括上述任意一種8.字符類:等價(jià)于\d[0-9]任意單個(gè)數(shù)字\D[^0-9]任意單個(gè)的非數(shù)字字符\w[a-zA-Z0-9_]\W[^a-zA-Z0-9_]\s[\f\n\r\t\v]\S[^\f\n\r\t\v]9.POSIX字符類:例如:[:digit:][0-9];[:alpha:][a-zA-Z];[:alnum:][a-zA-Z0-9]具體應(yīng)用時(shí)要再加一層括號,比如TEST[[:digit:]]匹配TEST0-TEST9。三、匹配元素組合:下面X,Y都可以是一個(gè)子表達(dá)式1.順序結(jié)構(gòu)XY:匹配X后緊跟Y的文本,比如[0-9][a-z]匹配數(shù)字后跟小寫字母的文本,7z,0x等,但不匹配ap,77。2.多選分支結(jié)構(gòu)X|Y:匹配X或者Y,比如[0-9]|[a-z]匹配數(shù)字或小寫字母,相當(dāng)于[0-9a-z]。X|Y是一種多選分支結(jié)構(gòu),在構(gòu)造復(fù)雜正則表達(dá)式中有重要作用。3.匹配量詞:匹配一個(gè)或多個(gè)X:X+;例如s/d+匹配s后跟至少一個(gè)數(shù)字,s9,s34,s235,...匹配零個(gè)或多個(gè)X:X*;例如s/d*匹配s后跟空或者至少一個(gè)數(shù)字,s,s9,s34,s235,...匹配零個(gè)或一個(gè)X:X?;例如https?匹配http或https匹配恰好m個(gè)X:X{m};例如s/d{4}匹配s0000,s1234,但不匹配s234,s23445匹配至少m個(gè)X:X{m,};例如s/d{2,}匹配s12,s123,但不匹配s1匹配至少m個(gè)但不超過n個(gè)X:X{m,n};例如s/d{2,4},匹配s12,s123,s1234,但不匹配s1,s123454.子表達(dá)式(X):將X作為一個(gè)子表達(dá)式,緊鄰的匹配量詞將作用于X整體,而不是X中的單個(gè)字符。例如(s\d){3}匹配s1s1s1,而不匹配s1115.貪婪匹配:默認(rèn)匹配模式是“貪婪型匹配”,即匹配盡可能多的文本。例如,Youmakemelost.正則式.*中的.*將從Y前面的空格一直匹配到末尾的換行符之前,而不會在第一個(gè)停下來。6.位置匹配:[1]\b單詞邊界\B非單詞邊界。文本:Thecaptainworehiscapandcapeproudlyashesatlisteningtotherecapofhowhiscrewsavedthemenfromacapsizedvessel.正則式:cap;\bcap;cap\b;\bcap\b;\Bcap;cap\B;\Bcap\B[2]^匹配文本起始$匹配文本末尾例如^[a-z]123將匹配以小寫字母開頭后跟123的文本。匹配文本a123而不是slha123。[a-z]123$將匹配以小寫字母后跟123結(jié)尾的文本。匹配文本sssd123而不是sdf123dss。7.捕獲功能:使用括號將一個(gè)子表達(dá)式匹配的文本進(jìn)行捕獲,后面可在模式或處理中對捕獲的文本進(jìn)行引用或處理。((regex1)-(regex2))-(regex3)\n引用被捕獲的第n個(gè)文本;n按左括號出現(xiàn)的順序進(jìn)行標(biāo)識\0表示匹配的整個(gè)文本\1ref=((regex1)-(regex2));\2ref=(regex1);\3ref=(regex2);\4ref=(regex3)在替換文本時(shí)可以使用$1,$2,$3,$4分別引用\1,\2,\3,\4捕獲的文本。比如,(\d{3})mygod(\1)必須匹配三位數(shù)字mygod三位數(shù)字的模式,并且,后面三位數(shù)字必須與前面三位數(shù)字完全相同。8.回溯引用:相同匹配的概念,匹配在多處出現(xiàn)的相同文本。比如要匹配hello中的...,使用正則式.*?,這里,\1可以捕獲([hH][1-6])所得到的結(jié)果,從而起到對應(yīng)的效果,以免匹配到23的不合法文本。文本:HELLOWORLDWAOYEAH正則式:.*?.*?9.前后查找:更靈活的位置匹配(?=right-regex):表示右邊字符序列匹配right-regex的位置;(?...