您好,登錄后才能下訂單哦!
正則表達式描述了一種字符串的匹配模式,可以用來檢查一個串是否含有某子串,或是特定字符串是否匹配特定規則.
換句話說就是記錄文本規則的一段代碼。其目的在于精確地過濾字符,找到想要的字符。
歷史:正則表達式的第一個實用應用程序就是 Unix 中的 qed 編輯器 此后便被廣泛用在文本搜索和匹配上
結構:正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文字模式
第一小節:元字符
下面是一些常見的元字符
\b 代表單詞的開頭或結尾,即單詞的分界.匹配的是一個位置。 'en' 很多單詞都包含,women men engage ,如果想要準確地找'en'這個單詞,應當使用\b來表達分界,例如:\ben\b
\d 匹配數字 例如 :0~9
\s 匹配任意空白字符
\w 匹配字母數字或下劃線或漢子 例如:a-z或0~9或_或漢子
. 匹配除換行符以外的任意字符
\n 換行符
^ 匹配字符串的開始,多用在輸入驗證
$ 匹配字符串的結束,多用在輸入驗證
* 代表數量,,指定前邊的內容可以連續重復使用任意次
學習正則的表達式最好的方法是從例子學習,下面將介紹大量的實例
eg : \bhi\b.*\blucy\b 解釋:顯示一個單詞hi,中間跟任意字符,不包括換行,最后是lucy
eg: 0\d\d-\d\d\d\d\d\d\d 解釋:以0開頭然后兩個任意數字然后-然后8位任意數字
為了避免煩人的重復可以{數字}來表達次數,有關次數在后文會詳細介紹
eg: 0\d{2}-\d{8} 解釋:0開始然后是兩位數字,然后是-,然后是8位數字,表示必須連續出現的匹配次數,其中-并不是元字符 ,只是普通字符,匹配它本身而已
eg: ^\d{5,12}$ 解釋:以數字開頭,數字結尾,長度5到12位
第二小節:字符轉義 \
如果想查詢元字符.*本身,你沒辦法指定他們,這時候就要使用\來取消這些字符的特殊意義,因此,使用\.\* ,查找‘\’本身也要轉義\\
eg: www.baidu.com www\.baidu\.com
eg:c:\\user c:\\\\user
第三小節:重復又稱限定符 {}
類似 *,+,{2},{2,5} 都是表示次數的方式。
*:多次或0次
+:1次或多次
?:0次或1次
{n}:n次
{n,}n次或多次
{n,m}:n-m次
eg: window\d+ 解釋:windows后跟一個或多個數字
eg: ^\d{m,n}$ 解釋:m到n位數字
eg: \ba\w+y\b 解釋: 一個以a開頭,中間是1個或多個任意字符,然后是以y結尾的單詞 eg: any ,
第四小節:字符類 []
如果想要查找數字字母,空白很簡單因為有\w \d \s ,但是對于預定義字符集沒有辦法。這時可以自己定義使用字符類
[a-z] 小寫字母a到z任意一個,[A-Z]大寫字母A到Z任意一個。[0-9]任意一個數字,其效果與\d類似。[a-z0-9A-Z]等同于\w。
eg:[aeiou] 解釋:匹配任意一個英文元音字母
eg: [,.!] 解釋:匹配任意一個標點
eg:^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 解釋:判斷帳號是否合法(字母開頭,然后是字母數字下劃線結尾,出現4到15次)
eg: ^[a-zA-Z]\w{5,17}$ 解釋: 匹配密碼(以字母開頭不區分大小寫,然后是字母數字下劃線結尾 ,出現5到17次,與上例異曲同工)
eg:[\u4e00-\u9fa5] 解釋: 匹配中文字符的正則表達式
第五小節:分支條件 |
分支條件在正則表達式里指的是有幾種匹配規則 ,如果滿足任意一種規則都匹配
用|把不同的規則隔開,
注意:使用分支條件是有順序的,優先匹配到最先匹配到的分支,匹配分之是將會從左到右如果滿足了某個分之就不再管其他分支 。
eg : \d{5}-\d{4}|\d{5} 解釋:表達式匹配5位數字然后-然后4位數字,或者直接5位數字,
如果把分支順序改一下則是
eg:\d{5}|\d{5}-\d{4} 解釋: 如果匹配到5位數字,則后面的分支就不再進行匹配。
eg : 0\d{2}-\d{8}|0\d{3}-\d{7} 解釋:匹配一種三位區號8位本地號碼或是一種4位區號,7位本地號碼
eg:^\d{15}|\d{18}$ 解釋:×××號(15位、18位數字), 以數字開頭,數字結尾,15位數字\d{15}或18位數字\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}$
解釋:手機號碼。遇到較長的正則表達式記住要拆開分解來看。先不看括號里的
大框架是^()\d{8}$ ()里的某些東西開頭,數字結尾,共8位數字,然后是()里的內容,
就是對手機號 前三位的特殊性進行規則匹配 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] 就是四個分支而已。
第六小節:分組()
正則表達式用處最多的就是()了,()在正則表達式里成為分組。
分組常常和重復即限定符連起來一起使用。用以表達括號里的東西作為一個整體重復出現多少次。
eg:(\w+\d?){3} 解釋:數字字母下劃出現一次或多次然后出現0次或1次一個數字,這樣的整體出現3次。
eg: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
解釋:Email地址 開頭^是一次或多次+任意字符\w分組(字符類[-+.]出現-+.任意一個,
然后是一次或多次\w) 這個分組出現0次或多次,
然后是@任意多個\w接著又是
分組([-.]\w+)出現*次,然后是出現一個.然后是\w+最后是結尾$分組([-.]\w+)*
email的標準是 用戶名@郵箱域名.com
有的還會有. eg:zhangsan@sina.com zhangsan.Mr.kk@sina.com
eg: ^((0?[1-9])|((1|2)[0-9])|30|31)$ 解釋:一個月的31天(01~09和1~31)
eg: (\d{1,3}\.){3}\d{1,3} 解釋:簡單的ip地址匹配 1到3位數字然后. 這個組合出現3次最后再加一個1到3位的數字 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地址匹配 拆解來看結構是(){3}(),分組作為一個整體出現3次,
然后又是一個分 組。 括號里(2[0-4]\d|25[0-5]|[01]?\d\d?)繼續拆分其實就
是三個分支,2[0-4]\d 200-249,25[0-5] 250-255,
[01]?\d\d? 0-9或者0-99或者199 [01] 匹配任何一個數字0,1
總體來看就是滿足這三個分支任意一個都行,然后出現一個.這樣的分組出現三次,
最后一個分組 一樣就是不帶.這 樣就好理解多了。
注意:如果在正則表達式里想用()而不是分組需要轉義。\(\) 代表)
eg: \(?0\d{2}\)?[ -]?\d{8}|0\d{2}[ -]?\d{8}
(011)-12345678 011-12345678 011 12345678 01112345678
第七小節:反義
eg: 想查找除了數字以外任意字符都行 這時需要用到反義
\W :匹配任意不是字母,數字,下劃線,漢子的字符 大寫W
\S匹配任意不是空白的字符 大寫S
\D匹配任意非數字的字符 大寫D
\B匹配不是單詞開頭或結束的位置 大寫B
[^x]匹配除了x的任意字符
[^aeiou]匹配除了aeiou這幾個字母以外的任意字符
\S+匹配 1個或多個不是空白的字符
eg:<a[^>]+> 解釋: 匹配用尖括號括起來的以a開頭除了>的一個或多個字符,即:匹配用尖括號括起來的以a開頭的字符串
第八小節:正則表達式的運算符優先級
正則表達式從左到右進行計算,并遵循優先級順序,這與算術表達式非常類似。
相同優先級的從左到右進行運算,不同優先級的運算先高后低。下表從最高到最低說明了各種正則表達式運算符的優先級順序:
運算符 | 描述 |
---|---|
\ | 轉義符 |
(), (?:), (?=), [] | 圓括號和方括號 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \任何元字符、任何字符 | 定位點和序列(即:位置和順序) |
| | 替換,"或"操作 |
第九小節:后向引用 (exp) ,(?<name>exp),(?''exp)
百科下來的術語是這樣解釋:使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。
后向引用 用于重復搜索前面某個分組匹配的文本
其核心就是捕獲
(exp) exp匹配到的東西放到默認組里,后續用這個組里匹配到的東西 就用\1
(?<name>exp) exp匹配到的東西放到名為name的組里,后續用這個組里匹配到的東西 就用 \k<name>
eg: 第一種寫法 \b(\w+)\b\s+\1\b 解釋:\1代表分組1匹配的文本, 首先是一個單詞然后是單詞開始和結束之間的多余1個的字母或數字會被捕獲到編號為1的分組,然后是1個或幾個空白字符,最后是分組1中捕獲的內容, 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空格,然后是調用1號組捕獲到的東西,可能就是 any any
第二種寫法 \b(?<hehe>a\w+y )\b\s+\K<hehe>\b
第三種寫法 \b(?'hehe'a\w+y )\b\s+\K'hehe'\b
第十小節:零寬斷言(?=exp),(?<=exp)
所謂斷言就是表達式exp
零寬斷言就是查找指定某些內容之前或之后的內容而不包括表達式部分
(?=exp) 零寬度正預測先行斷言.斷言自身出現的位置之后能匹配的表達式
eg: \b\w+(?=ing\b) 解釋:匹配\w+之后以ing結尾的單詞但不包括ing的部分 eating 去掉ing的部分 即 eat
eg: \b[aeiou]\w+(?=ed\b) 解釋: 匹配元音字母的任意一個開頭,然后是任意字符,1次或多次,最后是以ed結尾的單詞但不包含ed的部分, apped 去掉ed 即app
(?<=exp) 零寬度正回顧后發斷言,它斷言自身出現的位置的前面能匹配表達式exp
(?<=\pre)\w+\b 匹配單詞以re開頭但不包括re的部分 Prefixes 即 fixes
eg:(?<=\s)\d+(?=\s)
解釋:(?<=\s) 零寬斷言,匹配1個或多個數字,前面是(?<=\s) 但不包含空格的部分,后面是(?=\s) ,但不包含空格的部分。即以空白符間隔的數字
后向引用和零寬斷言連起來使用
eg:(?<=<(\w+)>).*(?=<\/\1>)等價于 (?<=<(?<label>\w+)>).*(?=<\/\k<label>>)
解釋:匹配不帶屬性的html標簽里的內容 匹配.*前面是<1個或多個\w>,但不包含這部分,
后面是<轉義\/,捕獲前面分組(\w+)的內容 >但不包含這部分
eg: <p>xxxxx</p>,匹配的就是xxx這部分
第十一小節:負向零寬斷言(?!exp),(?<!exp)
(?!exp)零寬度負預測先行斷言
斷言此位置的后面不能匹配表達式exp
eg :\d{3}(?!\d) 解釋:匹配三位數字,后面不能是數字
eg: [1-9]\d{5}(?!\d) 解釋:匹配開頭是1到9任意一位,然后是5位數字,后面不能是數字。中國郵政編碼: (中國郵政編碼為6位數字)
(?<!exp)零寬度負回顧后發斷言 斷言此位置前面不能匹配的表達式exp
eg: \b ((?<![aeiou ]>)\w)+\b 解釋:匹配不包含元音連續字符串的單詞
eg: (?<![0-9])\w+ 解釋: 匹配前面不是數字的字符
第十二小節:貪婪與懶惰
貪婪
正則表達式在滿足整體表達式的規則下會貪婪盡可能多的匹配
eg: qweqweqwe q.*e 匹配以q開始,以e結束最多字符
會匹配到 qweqweqwe 而不是 qweqwe 或者qwe
懶惰
滿足整條表達式時盡可能少的匹配,
在后面加一個?即可
*? :重復任意次,但盡可能少重復
+? :重復1次或多次,,但盡可能少重復
?? :重復0次或1次,但盡可能少重復
{n,}? :重復n次以上,但盡可能少重復
{n,m}?:重復n到m次,但盡可能少重復
eg: qweqweqwe q.*?e 匹配以q開始,以e結束最短字符.
會匹配到 qwe
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。