溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

正則表達(dá)式簡明筆記

發(fā)布時(shí)間:2020-07-16 04:57:00 來源:網(wǎng)絡(luò) 閱讀:588 作者:奇葩界張三 欄目:開發(fā)技術(shù)

正則表達(dá)式描述了一種字符串的匹配模式,可以用來檢查一個(gè)串是否含有某子串,或是特定字符串是否匹配特定規(guī)則.

換句話說就是記錄文本規(guī)則的一段代碼。其目的在于精確地過濾字符,找到想要的字符。

歷史:正則表達(dá)式的第一個(gè)實(shí)用應(yīng)用程序就是 Unix 中的 qed 編輯器 此后便被廣泛用在文本搜索和匹配上

結(jié)構(gòu):正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文字模式


第一小節(jié):元字符 

下面是一些常見的元字符

\b  代表單詞的開頭或結(jié)尾,即單詞的分界.匹配的是一個(gè)位置。 'en' 很多單詞都包含,women men engage ,如果想要準(zhǔn)確地找'en'這個(gè)單詞,應(yīng)當(dāng)使用\b來表達(dá)分界,例如:\ben\b

\d 匹配數(shù)字 例如 :0~9

\s 匹配任意空白字符 

\w 匹配字母數(shù)字或下劃線或漢子 例如:a-z或0~9或_或漢子

.  匹配除換行符以外的任意字符 

\n 換行符

^ 匹配字符串的開始,多用在輸入驗(yàn)證

$ 匹配字符串的結(jié)束,多用在輸入驗(yàn)證

*  代表數(shù)量,,指定前邊的內(nèi)容可以連續(xù)重復(fù)使用任意次


學(xué)習(xí)正則的表達(dá)式最好的方法是從例子學(xué)習(xí),下面將介紹大量的實(shí)例

eg : \bhi\b.*\blucy\b  解釋:顯示一個(gè)單詞hi,中間跟任意字符,不包括換行,最后是lucy

eg: 0\d\d-\d\d\d\d\d\d\d  解釋:以0開頭然后兩個(gè)任意數(shù)字然后-然后8位任意數(shù)字

為了避免煩人的重復(fù)可以{數(shù)字}來表達(dá)次數(shù),有關(guān)次數(shù)在后文會(huì)詳細(xì)介紹

eg: 0\d{2}-\d{8}  解釋:0開始然后是兩位數(shù)字,然后是-,然后是8位數(shù)字,表示必須連續(xù)出現(xiàn)的匹配次數(shù),其中-并不是元字符 ,只是普通字符,匹配它本身而已

eg: ^\d{5,12}$  解釋:以數(shù)字開頭,數(shù)字結(jié)尾,長度5到12位



第二小節(jié):字符轉(zhuǎn)義 \

如果想查詢元字符.*本身,你沒辦法指定他們,這時(shí)候就要使用\來取消這些字符的特殊意義,因此,使用\.\* ,查找‘\’本身也要轉(zhuǎn)義\\

eg: www.baidu.com   www\.baidu\.com   

eg:c:\\user   c:\\\\user  


第三小節(jié):重復(fù)又稱限定符  {}

類似 *,+,{2},{2,5} 都是表示次數(shù)的方式。

*:多次或0次

+:1次或多次

?:0次或1次

{n}:n次

{n,}n次或多次

{n,m}:n-m次

eg: window\d+  解釋:windows后跟一個(gè)或多個(gè)數(shù)字

eg: ^\d{m,n}$      解釋:m到n位數(shù)字

eg: \ba\w+y\b     解釋: 一個(gè)以a開頭,中間是1個(gè)或多個(gè)任意字符,然后是以y結(jié)尾的單詞  eg: any , 



第四小節(jié):字符類 []

如果想要查找數(shù)字字母,空白很簡單因?yàn)橛衆(zhòng)w \d \s ,但是對于預(yù)定義字符集沒有辦法。這時(shí)可以自己定義使用字符類 

[a-z]  小寫字母a到z任意一個(gè),[A-Z]大寫字母A到Z任意一個(gè)。[0-9]任意一個(gè)數(shù)字,其效果與\d類似。[a-z0-9A-Z]等同于\w。

eg:[aeiou]                                         解釋:匹配任意一個(gè)英文元音字母 

eg: [,.!]                                              解釋:匹配任意一個(gè)標(biāo)點(diǎn)

eg:^[a-zA-Z][a-zA-Z0-9_]{4,15}$      解釋:判斷帳號是否合法(字母開頭,然后是字母數(shù)字下劃線結(jié)尾,出現(xiàn)4到15次)

eg: ^[a-zA-Z]\w{5,17}$                     解釋: 匹配密碼(以字母開頭不區(qū)分大小寫,然后是字母數(shù)字下劃線結(jié)尾 ,出現(xiàn)5到17次,與上例異曲同工)

eg:[\u4e00-\u9fa5]                         解釋: 匹配中文字符的正則表達(dá)式


第五小節(jié):分支條件 |

分支條件在正則表達(dá)式里指的是有幾種匹配規(guī)則 ,如果滿足任意一種規(guī)則都匹配

用|把不同的規(guī)則隔開,

注意:使用分支條件是有順序的,優(yōu)先匹配到最先匹配到的分支,匹配分之是將會(huì)從左到右如果滿足了某個(gè)分之就不再管其他分支 。

eg : \d{5}-\d{4}|\d{5}               解釋:表達(dá)式匹配5位數(shù)字然后-然后4位數(shù)字,或者直接5位數(shù)字,

如果把分支順序改一下則是 

eg:\d{5}|\d{5}-\d{4}               解釋: 如果匹配到5位數(shù)字,則后面的分支就不再進(jìn)行匹配。         

eg :  0\d{2}-\d{8}|0\d{3}-\d{7}  解釋:匹配一種三位區(qū)號8位本地號碼或是一種4位區(qū)號,7位本地號碼

eg:^\d{15}|\d{18}$                解釋:×××號(15位、18位數(shù)字), 以數(shù)字開頭,數(shù)字結(jié)尾,15位數(shù)字\d{15}或18位數(shù)字\d{18} 

eg:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$  

解釋:手機(jī)號碼。遇到較長的正則表達(dá)式記住要拆開分解來看。先不看括號里的

         大框架是^()\d{8}$ ()里的某些東西開頭,數(shù)字結(jié)尾,共8位數(shù)字,然后是()里的內(nèi)容,

         就是對手機(jī)號 前三位的特殊性進(jìn)行規(guī)則匹配                                                                                          13[0-9],14[5|7],15[0|1|2|3|5|6|7|8|9],18[0|1|2|3|5|6|7|8|9] 就是四個(gè)分支而已。



第六小節(jié):分組()

正則表達(dá)式用處最多的就是()了,()在正則表達(dá)式里成為分組。

分組常常和重復(fù)即限定符連起來一起使用。用以表達(dá)括號里的東西作為一個(gè)整體重復(fù)出現(xiàn)多少次。

eg:(\w+\d?){3}   解釋:數(shù)字字母下劃出現(xiàn)一次或多次然后出現(xiàn)0次或1次一個(gè)數(shù)字,這樣的整體出現(xiàn)3次。

eg: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$   

解釋:Email地址  開頭^是一次或多次+任意字符\w分組(字符類[-+.]出現(xiàn)-+.任意一個(gè),
          然后是一次或多次\w) 這個(gè)分組出現(xiàn)0次或多次,  然后是@任意多個(gè)\w接著又是

          分組([-.]\w+)出現(xiàn)*次,然后是出現(xiàn)一個(gè).然后是\w+最后是結(jié)尾$分組([-.]\w+)* 

          email的標(biāo)準(zhǔn)是 用戶名@郵箱域名.com      

          有的還會(huì)有. eg:zhangsan@sina.com   zhangsan.Mr.kk@sina.com

eg: ^((0?[1-9])|((1|2)[0-9])|30|31)$         解釋:一個(gè)月的31天(01~09和1~31)

eg: (\d{1,3}\.){3}\d{1,3}                          解釋:簡單的ip地址匹配   1到3位數(shù)字然后. 這個(gè)組合出現(xiàn)3次最后再加一個(gè)1到3位的數(shù)字 eg:192.0.0.1

eg:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

 解釋:完整的ip4地址匹配 拆解來看結(jié)構(gòu)是(){3}(),分組作為一個(gè)整體出現(xiàn)3次,

           然后又是一個(gè)分 組。 括號里(2[0-4]\d|25[0-5]|[01]?\d\d?)繼續(xù)拆分其實(shí)就

           是三個(gè)分支,2[0-4]\d  200-249,25[0-5]  250-255,

           [01]?\d\d?    0-9或者0-99或者199 [01] 匹配任何一個(gè)數(shù)字0,1

           總體來看就是滿足這三個(gè)分支任意一個(gè)都行,然后出現(xiàn)一個(gè).這樣的分組出現(xiàn)三次,

           最后一個(gè)分組 一樣就是不帶.這 樣就好理解多了。

注意:如果在正則表達(dá)式里想用()而不是分組需要轉(zhuǎn)義。\(\) 代表)

eg:  \(?0\d{2}\)?[ -]?\d{8}|0\d{2}[ -]?\d{8}                                    

(011)-12345678  011-12345678  011 12345678  01112345678



第七小節(jié):反義

eg: 想查找除了數(shù)字以外任意字符都行 這時(shí)需要用到反義

\W :匹配任意不是字母,數(shù)字,下劃線,漢子的字符 大寫W

\S匹配任意不是空白的字符   大寫S

\D匹配任意非數(shù)字的字符   大寫D

\B匹配不是單詞開頭或結(jié)束的位置   大寫B(tài)

[^x]匹配除了x的任意字符

[^aeiou]匹配除了aeiou這幾個(gè)字母以外的任意字符

\S+匹配 1個(gè)或多個(gè)不是空白的字符

eg:<a[^>]+>  解釋: 匹配用尖括號括起來的以a開頭除了>的一個(gè)或多個(gè)字符,即:匹配用尖括號括起來的以a開頭的字符串



第八小節(jié):正則表達(dá)式的運(yùn)算符優(yōu)先級

正則表達(dá)式從左到右進(jìn)行計(jì)算,并遵循優(yōu)先級順序,這與算術(shù)表達(dá)式非常類似。

相同優(yōu)先級的從左到右進(jìn)行運(yùn)算,不同優(yōu)先級的運(yùn)算先高后低。下表從最高到最低說明了各種正則表達(dá)式運(yùn)算符的優(yōu)先級順序:

運(yùn)算符描述
\轉(zhuǎn)義符
(), (?:), (?=), []圓括號和方括號
*, +, ?, {n}, {n,}, {n,m}限定符
^, $, \任何元字符、任何字符定位點(diǎn)和序列(即:位置和順序)
|替換,"或"操作


第九小節(jié):后向引用 (exp) ,(?<name>exp),(?''exp)


百科下來的術(shù)語是這樣解釋:使用小括號指定一個(gè)子表達(dá)式后,匹配這個(gè)子表達(dá)式的文本(也就是此分組捕獲的內(nèi)容)可以在表達(dá)式或其它程序中作進(jìn)一步的處理。默認(rèn)情況下,每個(gè)分組會(huì)自動(dòng)擁有一個(gè)組號,規(guī)則是:從左向右,以分組的左括號為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號為1,第二個(gè)為2,以此類推。

后向引用 用于重復(fù)搜索前面某個(gè)分組匹配的文本 

其核心就是捕獲

(exp) exp匹配到的東西放到默認(rèn)組里,后續(xù)用這個(gè)組里匹配到的東西 就用\1

(?<name>exp) exp匹配到的東西放到名為name的組里,后續(xù)用這個(gè)組里匹配到的東西 就用 \k<name>

eg: 第一種寫法  \b(\w+)\b\s+\1\b   解釋:\1代表分組1匹配的文本, 首先是一個(gè)單詞然后是單詞開始和結(jié)束之間的多余1個(gè)的字母或數(shù)字會(huì)被捕獲到編號為1的分組,然后是1個(gè)或幾個(gè)空白字符,最后是分組1中捕獲的內(nèi)容, eg summer summer

      第二種寫法  \b(?<word>\w+)\b\s+\K<word>\b

      第三種寫法   \b(?'word'\w+)\b\s+\K'word'\b

eg:  第一種寫法  \b(a\w+y)\b\s+\1\b  解釋:單詞axxy然后被捕獲放到1號組里,然后\s空格,然后是調(diào)用1號組捕獲到的東西,可能就是 any  any

      第二種寫法  \b(?<hehe>a\w+y )\b\s+\K<hehe>\b

      第三種寫法   \b(?'hehe'a\w+y )\b\s+\K'hehe'\b


第十小節(jié):零寬斷言(?=exp),(?<=exp)

所謂斷言就是表達(dá)式exp

零寬斷言就是查找指定某些內(nèi)容之前或之后的內(nèi)容而不包括表達(dá)式部分

(?=exp) 零寬度正預(yù)測先行斷言.斷言自身出現(xiàn)的位置之后能匹配的表達(dá)式

eg:    \b\w+(?=ing\b)   解釋:匹配\w+之后以ing結(jié)尾的單詞但不包括ing的部分  eating 去掉ing的部分 即 eat

eg:   \b[aeiou]\w+(?=ed\b)   解釋: 匹配元音字母的任意一個(gè)開頭,然后是任意字符,1次或多次,最后是以ed結(jié)尾的單詞但不包含ed的部分, apped 去掉ed  即app


(?<=exp)  零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面能匹配表達(dá)式exp

(?<=\pre)\w+\b 匹配單詞以re開頭但不包括re的部分  Prefixes 即 fixes

eg:(?<=\s)\d+(?=\s)  

解釋:(?<=\s)  零寬斷言,匹配1個(gè)或多個(gè)數(shù)字,前面是(?<=\s) 但不包含空格的部分,后面是(?=\s) ,但不包含空格的部分。即以空白符間隔的數(shù)字

后向引用和零寬斷言連起來使用

eg:(?<=<(\w+)>).*(?=<\/\1>)等價(jià)于 (?<=<(?<label>\w+)>).*(?=<\/\k<label>>)    

解釋:匹配不帶屬性的html標(biāo)簽里的內(nèi)容  匹配.*前面是<1個(gè)或多個(gè)\w>,但不包含這部分,
  后面是<轉(zhuǎn)義\/,捕獲前面分組(\w+)的內(nèi)容 >但不包含這部分

  eg: <p>xxxxx</p>,匹配的就是xxx這部分

 

第十一小節(jié):負(fù)向零寬斷言(?!exp),(?<!exp)

(?!exp)零寬度負(fù)預(yù)測先行斷言

斷言此位置的后面不能匹配表達(dá)式exp

eg :\d{3}(?!\d)  解釋:匹配三位數(shù)字,后面不能是數(shù)字

eg:  [1-9]\d{5}(?!\d)   解釋:匹配開頭是1到9任意一位,然后是5位數(shù)字,后面不能是數(shù)字。中國郵政編碼: (中國郵政編碼為6位數(shù)字)


(?<!exp)零寬度負(fù)回顧后發(fā)斷言  斷言此位置前面不能匹配的表達(dá)式exp

eg:  \b ((?<![aeiou ]>)\w)+\b  解釋:匹配不包含元音連續(xù)字符串的單詞

eg:  (?<![0-9])\w+           解釋: 匹配前面不是數(shù)字的字符



第十二小節(jié):貪婪與懶惰

貪婪

正則表達(dá)式在滿足整體表達(dá)式的規(guī)則下會(huì)貪婪盡可能多的匹配

eg: qweqweqwe     q.*e      匹配以q開始,以e結(jié)束最多字符

會(huì)匹配到 qweqweqwe  而不是 qweqwe  或者qwe

懶惰

滿足整條表達(dá)式時(shí)盡可能少的匹配,

在后面加一個(gè)?即可

*? :重復(fù)任意次,但盡可能少重復(fù)

+? :重復(fù)1次或多次,,但盡可能少重復(fù)

?? :重復(fù)0次或1次,但盡可能少重復(fù)

{n,}?  :重復(fù)n次以上,但盡可能少重復(fù)

{n,m}?:重復(fù)n到m次,但盡可能少重復(fù)

eg:  qweqweqwe   q.*?e  匹配以q開始,以e結(jié)束最短字符.

會(huì)匹配到 qwe


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI