使用man grep檢視grep的幫助文檔,有如下内容:

可以看出,正規表達式由三類,分别是
- 基本的正規表達式(Basic Regular Expression 又叫 Basic RegEx 簡稱 BREs)
- 擴充的正規表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)
- Perl 的正規表達式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)
由于BREs文法中需要大量轉義字元,導緻正規表達式不易看懂,是以本文使用Perl類型的正規表達式。
1.校驗MAC位址
我們常見的MAC地有如下兩種格式:
48-5D-60-DE-3D-C5
48:5D:60:61:3D:C5
我們以第一種為例,即一共有6組十六進制的數中間由短橫線“-”連接配接。每組十六進制的資料可以看成是由取值範圍為a-f、A-F或0-9的兩個字元組成。
首先,用正規表達式表示a-f、A-F或0-9的兩個字元
[a-fA-F0-9] [a-fA-F0-9]
可以發現[a-fA-F0-9]重複了兩次,是以上述表達式可以寫成
[a-fA-F0-9] {2}
然後,用正規表達式表示六組a-f、A-F或0-9的兩個字元中間用短橫線連接配接:
[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}
上述正規表達式太臃腫了,一組兩位的其實我們可以看成
[a-fA-F0-9]{2}-重複了5次(注意後邊有個短橫線),最後又加了一組[a-fA-F0-9]{2},而其中的0-9可以用\d代替。基于這樣的思路,對上述正規表達式進行修改後如下所示:
([a-fA-F\d]{2}-){5}[a-fA-F\d]{2}
最後,我們檢驗下上述正規表達式是否滿足要求。建立一個mac.txt,内容如下所示:
48-5D-60-61-3D-C5
08-D4-hM-1D-AD-AE
28-D2-44-B7-AD-EC
XX-5D-60-61-3D-C5
其中第2和第4行是錯誤的MAC位址,檢測結果如下:
由以上結果可以看出上述正規表達式是正确的。
2.校驗郵箱位址
下表是常見的郵箱格式:
@字首 | 純數字 | [email protected] |
---|---|---|
純字母 | [email protected] | |
字母數字混合 | [email protected] | |
帶點的 | [email protected] | |
帶下劃線 | [email protected] | |
帶連接配接線 | [email protected] | |
@字尾 | 二級域名 | [email protected] |
三級域名 | [email protected] |
根據上述常見郵箱格式,我們可以總結出郵箱格式符合的規則
1) 郵箱必有一個@
2) 郵箱@字首由數字或字母開頭
3) 郵箱@字首由多個字母、數字、段橫線-、下劃線_、英文句号.自由拼接而成
4) 郵箱@字尾由兩級或三級域名組成,其中每個域名中間由英文句号“.”隔開, 而每級域名都是由字母或數字組成
根據以上規則,可以得到如下正規表達式:
1) 郵箱必有一個@ ,對應正規表達式如下所示:
@
2) 郵箱@字首由數字或字母開頭,對應正規表達式如下所示:
^[a-zA-Z0-9]@
其中^表示開始位置,[a-zA-Z0-9]表示數字或字母
3) 郵箱@字首由多個字母、數字、段橫線-、下劃線_、英文句号.自由拼接而成
^[a-zA-Z0-9][a-zA-Z0-9-._]+@
其中+表示重複1到多次
4) 郵箱@字尾由兩級或三級域名組成,其中每個域名中間由英文句号“.”隔開,而每級域名都是由字母或數字組成。
@([a-zA-Z0-9]+.){1,2}[a-zA-Z0-9]+$
其中([a-zA-Z0-9]+.){1,2}可以拆分成如下内容:
[a-zA-Z0-9] 數字或字母
[a-zA-Z0-9]+數字或字母重複1到多次
[a-zA-Z0-9]+.數字或字母重複1到多次後邊加上英文句号.
([a-zA-Z0-9]+.){1,2}數字或字母重複1到多次後邊加上英文句号.做為一個整體重複1到2次。
最後的[a-zA-Z0-9]+表示以多個數字或字母結尾。
将上述郵箱@字首的正規表達式和郵箱@字尾的正規表達式組合在一起,同時由于0-9的數字可以用\d表示,可以用\d替換内容中的0-9,最後得到的表達式我們想要的可以比對郵箱的正規表達式,如下所示:
^[a-zA-Z\d][a-zA-Z\d-._]+@([a-zA-Z\d]+.){1,2}[a-zA-Z\d]+$
下面我們來檢驗下寫出來的正規表達式:
建立一個mail.txt,内容如下:
[email protected]
其中最後三行為錯誤的格式,使用正規表達式進行校驗:
由上述結果可以看出,我們的正規表達式是符合要求的。
3.校驗手機号
要校驗手機号,我們首先需要知道手機号的組成格式。目前國内的手機号有以下格式:
1)由數字1開頭
2)第二位數字的取值範圍是3、4、5、7、8、
3)最後為9位數字
根據以上規則,寫出對應的正規表達式
- 由數字1開頭
^1
- 第二位數字的取值範圍是3、4、5、7、8、
[34578]
- 最後為9位數字
[0-9]{9}$
其中[0-9]{9}表示0-9的數字取值重複9次,$表示結尾。由于0-9的數字可以由\d表示,上述内容等價于
\d{9}$
将上述正規表達式組合在一起,就可以得到我們想要的正規表達式,如下所示:
^1[34578]\d{9}$
下面開始進行校驗,建立一個phone.txt,内容如下:
138537721989
146398702123
12200993333
23848270281
13849199233
d333300-903
其中隻有倒數第二行的号碼是正确的,使用正規表達式進行校驗:
由上述結果可以看出,我們的正規表達式是符合要求的。
4.校驗IP位址
對IP位址進行嚴格校驗比較麻煩,首先要确定一個标準可用的IP位址需要滿足如下條件:
1) 由四組不大于255的數字組成,中間由“.”連接配接
2) 取值範圍為0.0.0.0-255.255.255.255
一個IP位址可以看成是四組0-255的數組中間由.隔開,進一步可以看成是0-255.重複三次(注意0-255後有點),後邊再跟上一個0-255的數字。
下面對0-255的數字可能的組成情況進行分析:
數字 | 取值 | 正規表達式 |
---|---|---|
三位數 | ||
25開頭 | 250-255 | 25[0-5] |
20-24開頭 | 200-249 | 2[0-4][0-9] |
1開頭 | 100-199 | 1[0-9][0-9]等價于1\d{2} |
二位數 | ||
兩位數 | 10-99 | [1-9]\d |
一位數 | ||
一位數 | 0-9 | \d |
将上述五種情況組合在一起就是我們想要的結果,這裡注意五種情況之間是或的關系,用|連接配接,可以得到(0-255)的正規表達式如下:
(25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d
以上是一組0-255的資料,上邊已經分析了思路,IP由三組(0-255).和一組0-255組成,三組(0-255).就是(0-255).重複三次。
首先是(0-255).的表達式:
((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d).
然後重複三次:
(((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d).){3}
最後加上一組(0-255):
(((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d).){3}((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d)
為了更嚴謹點,需要加上開始和結束限定符,如下所示:
^(((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d).){3}((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d)$
下面開始驗證,建立一個ip.txt,内容如下:
290.244.1900.3
254.263.233.0
192.168.266.900
aa.3.0.1
2.2.2.3b
127.02.0.00
192.168.212.11
0.0.0.0
255.255.255.255
其中隻有最後三行的IP位址是正确的,我們檢驗下剛才寫的正規表達式:
可以看到輸出結果達到了預期的效果,證明正規表達式是有效的。
連結:https://www.jianshu.com/p/e27d46e675a8