正則表達(dá)式描述了一種字符串的匹配模式,可以用來檢查一個(gè)串是否含有某子串,或是特定字符串是否匹配特定規(guī)則.
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括亭湖網(wǎng)站建設(shè)、亭湖網(wǎng)站制作、亭湖網(wǎng)頁制作以及亭湖網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,亭湖網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到亭湖省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!換句話說就是記錄文本規(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開頭除了>的一個(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) ,(?
百科下來的術(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
(?
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(?
第三種寫法 \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(?
第三種寫法 \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à)于 (?<=<(?
解釋:匹配不帶屬性的html標(biāo)簽里的內(nèi)容 匹配.*前面是<1個(gè)或多個(gè)\w>,但不包含這部分,
后面是<轉(zhuǎn)義\/,捕獲前面分組(\w+)的內(nèi)容 >但不包含這部分
eg:
xxxxx
,匹配的就是xxx這部分第十一小節(jié):負(fù)向零寬斷言(?!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ù)字)
(?
eg: \b ((?)\w)+\b 解釋:匹配不包含元音連續(xù)字符串的單詞
eg: (?解釋:匹配前面不是數(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
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。