對於正則表達式,第一眼時覺得完全沒有規律可尋,而且全是一堆各種各樣的特殊符號,完全不知所雲。其實唯一難的就是組合起來之后,可讀性比較差,而且不容易理解,其實能看得懂簡單的正則表達式,寫得出簡單的正則表達式,用以滿足日常的需求即可。學習正則表達式的最好方法是從例子開始,理解例子之后再自己對例子進行修改實踐。
一、正則表達式說明
1.簡介
正則表達式(regular expression)是一種特殊的字符串模式(pattern),用於匹配一組字符串,可以用來檢查一個串是否含有某種子串,將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
通俗的說,正則表達式好比用模具做產品,而正則就是這個模具,定義一種規則去匹配符合規則的字符。
2.常用的正則匹配工具
在線匹配工具:
http://www.regexpal.com/
http://rubular.com/
正則匹配軟件:McTracer
3.正則匹配的用途
-
匹配驗證: 判斷給定的字符串是否符合正則表達式所指定的過濾規則,從而可以判斷某個字符串的內容是否符合特定的規則(如email地址、手機號碼等),當正則表達式用於匹配驗證時,通常需要在正則表達式字符串的首部和尾部加上^和$,以匹配整個待驗證的字符串。
-
查找與替換: 判斷給定字符串中是否包含滿足正則表達式所指定的匹配規則的子串,如查找一段文本中的所包含的IP地址。另外,還可以對查找到的子串進行內容替換。
-
字符串分割與子串截取: 基於子串查找功能還可以以符合正則表達式所指定的匹配規則的字符串作為分隔符對給定的字符串進行分割。
二、正則表達式簡介
1.元字符
正則表達式中的字符分為 普通字符 和 元字符。大多數字符都將簡單地匹配它們的自身值,它們被稱為普通字符,如數字(0-9)
,字母(a-z, A-Z)
等,除了特殊元字符之外的所有字符都是普通字符。
代碼 | 說明 |
. | 匹配除換行符以外的任意字符 |
\ | 將下一個字符標記為一個特殊字符 |
\w | 匹配字母,數字,下划線或漢字 |
\s | 匹配任意的空白符 |
\d | 匹配數字,等價於[0-9] |
\b | 匹配單詞的開始或結束 |
^ | 匹配字符串的開始 |
$ | 匹配字符串的結束 |
[abc] |
字符組,匹配包含括號內元素的字符 |
2.反義字符
代碼/語法 | 說明 |
\W | 匹配任意不是字母,數字,下划線,漢字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非數字的字符 |
\B | 匹配不是單詞開頭或結束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^abc] | 匹配除了abc字母以外的任意字符 |
3.字符次數匹配
貪婪(貪心) ,如"*
"字符 貪婪量詞會首先匹配整個字符串,嘗試匹配時,它會選定盡可能多的內容,如果 失敗則回退一個字符,然后再次嘗試回退的過程就叫做回溯,它會每次回退一個字符,直到找到匹配的內容或者沒有字符可以回退。相比下面兩種貪婪量詞對資源的消耗是最大的。
懶惰(勉強) 如 "?
" 懶惰量詞使用另一種方式匹配,它從目標的起始位置開始嘗試匹配,每次檢查一個字符,並尋找它要匹配的內容,如此循環直到字符結尾處。
占有 如"+
" 占有量詞會覆蓋目標字符串,然后嘗試尋找匹配內容 ,但它只嘗試一次,不會回溯,就好比先抓一把石頭,然后從石頭中挑出黃金。
代碼/語法 | 說明 |
* | 貪婪:重復零次或更多次 |
+ | 懶惰:重復一次或更多次 |
? | 占有:重復零次或一次 |
{n} | 重復n次 |
{n,} | 重復n次或更多次 |
{n,m} | 重復n到m次 |
4.懶惰限定符
代碼/語法 | 說明 |
*? | 重復任意次,但盡可能少重復 |
+? | 重復1次或更多次,但盡可能少重復 |
?? | 重復0次或1次,但盡可能少重復 |
{n,m}? | 重復n到m次,但盡可能少重復 |
{n,}? | 重復n次以上,但盡可能少重復 |
貪婪模式與非貪婪模式影響的是被量詞修飾的子表達式的匹配行為,貪婪模式在整個表達式匹配成功的前提下,盡可能多的匹配;非貪婪模式在整個表達式匹配成功的前提下,盡可能少的匹配。另外,非貪婪模式只被部分NFA引擎所支持。從匹配效率上來看,能達到相同匹配結果時,貪婪模式的匹配效率通常會比較高,因為它回溯過程會比較少。
5.捕獲分組
代碼/語法 | 說明 |
(exp) |
匹配exp,並捕獲文本到自動命名的組里 |
(?<name>exp) |
匹配exp,並捕獲文本到名稱為name的組里 |
(?:exp) |
匹配exp,不捕獲匹配的文本,也不給此分組分配組號 |
(?=exp) |
匹配exp前面的位置 |
(?<=exp) |
匹配exp后面的位置 |
(?!exp) |
匹配后面跟的不是exp的位置 |
(?<!exp) |
匹配前面不是exp的位置 |
三、正則表達式優先級
正則表達式從左到右進行計算,並遵循優先級順序。相同優先級的從左到右進行運算,不同優先級的運算先高后低。
下表為從高到低排列各種正則表達式運算符的優先級順序:
運算符 | 描述 |
\ | 轉義符 |
(), (?:), (?=), [] | 圓括號和方括號 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \任何元字符、任何字符 | 定位點和序列(即:位置和順序) |
| | 替換,"或"操作 |
四、正則表達式常用實例
1.匹配一個URL地址
http或http鏈接可以這樣寫:
(https?://)?[\S]+
2.匹配一個IP地址
簡單寫法:
(\d+[.]){3}\d+
嚴謹寫法:
(((?:[1-9]\d?)|(?:1\d{2})|(?:2[0-4]\d)|(?:25[0-5]))[.]){3}((?:[1-9]\d?)|(?:1\d{2})|(?:2[0-4]\d)|(?:25[0-5]))
3.匹配一個郵箱地址
保證只出現一個@符:
[^\s@]+@[^\s@]+\.[^\s@]+
匹配網易郵箱:6-18個字符,只能包含字母、數字和下划線,且只能以字母開頭
[
匹配qq郵箱:3-18個字符,只能包含字母、數字、點、減號和下划線
[
匹配網易郵箱和qq郵箱:
(?:[a-zA-Z]\w{5,17}@(126|163)\.com)|(?:[\w.-]{3,18}@qq\.com)
4.匹配密碼是否合法
要求為非空字符且限定密碼長度為6-18位
^\S[6-18]$
必須同時包含含數字、大小字母、小寫字母和標點符號
(?=^.{6,8}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W+)
必須同時包含且只能包含數字、大小字母、小寫字母和標點符號
(?=^[\d\Wa-zA-Z]{6,8}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W+)
5.匹配大陸身份證號
15位和18位身份證號
(\d{2}|\d{4})-((0?[1-9])|(1[0-2]))-((0?[1-9])|([12][0-9])|(3[01]))
6.匹配日期
年月日
(\d{2}|\d{4})-((0?[1-9])|(1[0-2]))-((0?[1-9])|([12][0-9])|(3[01]))
7.匹配24小時制時間
(((0?|1)[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])
8.匹配QQ號碼
[
9.匹配手機號
1[356789]\d{9}
10.匹配大陸固定手機號
(\d{3,4}-)?\d{7,8}
11.匹配大陸郵政編碼
\d{6}
12.其他常用正則表達式
匹配內容 | 正則表達式 |
漢字 | [\u4e00-\u9fa5] |
中文及全角標點符號 | [\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee] |
不含abc的單詞 | (?=\w+)(?!abc) |
正整數 | [1-9]+ |
負整數 | -[1-9]+ |
非負整數(正整數+0) | [1-9]+ |
非正整數(負整數+0) | -[1-9]+ |
整數+0 | -?[1-9]+ |
正浮點數 | \d+.\d+ |
負浮點數 | -\d+.\d+ |
浮點數 | -?\d+.\d+ |
最后是今天的分享:正則表達式匹配工具 McTracer
正則表達式匹配工具 MCTracer
微信公眾號后台回復:MCTracer
推薦理由:
1.支持將正則導成對應的語言如java /C#/ js等;
2.支持轉義,Copy方便;
3.支持正則表達式用法解釋,如哪里是捕獲分組,哪段是貪婪匹配。
快來星標 置頂 關注我
后台 回復資源取干貨回復答題挑戰玩轉答題
想要獲取相關資料和軟件 ?
測試交流Q群:727998947