前言
使用man grep查看grep的幫助文檔,有如下內(nèi)容:

可以看出,正則表達式由三類,分別是
- 基本的正則表達式(Basic Regular Expression 又叫 Basic RegEx 簡稱 BREs)
- 擴展的正則表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)
- Perl 的正則表達式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)
由于BREs語法中需要大量轉(zhuǎn)義字符,導(dǎo)致正則表達式不易看懂,因此本文使用Perl類型的正則表達式。
1.校驗MAC地址
我們常見的MAC地有如下兩種格式:
48-5D-60-DE-3D-C5
48:5D:60:61:3D:C5
我們以第一種為例,即一共有6組十六進制的數(shù)中間由短橫線“-”連接。每組十六進制的數(shù)據(jù)可以看成是由取值范圍為a-f、A-F或0-9的兩個字符組成。
首先,用正則表達式表示a-f、A-F或0-9的兩個字符
[a-fA-F0-9] [a-fA-F0-9]
可以發(fā)現(xiàn)[a-fA-F0-9]重復(fù)了兩次,因此上述表達式可以寫成
[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}-重復(fù)了5次(注意后邊有個短橫線),最后又加了一組[a-fA-F0-9]{2},而其中的0-9可以用\d代替?;谶@樣的思路,對上述正則表達式進行修改后如下所示:
([a-fA-F\d]{2}-){5}[a-fA-F\d]{2}
最后,我們檢驗下上述正則表達式是否滿足要求。創(chuàng)建一個mac.txt,內(nèi)容如下所示:
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地址,檢測結(jié)果如下:

由以上結(jié)果可以看出上述正則表達式是正確的。
2.校驗郵箱地址
下表是常見的郵箱格式:
| @前綴 | 純數(shù)字 | 1234567@qq.com |
|---|---|---|
| 純字母 | zhang123@qq.com | |
| 字母數(shù)字混合 | zhang123@qq.com | |
| 帶點的 | zhang.san@qq.com | |
| 帶下劃線 | zhang_san@qq.com | |
| 帶連接線 | zhang-san@qq.com | |
| @后綴 | 二級域名 | 123456@qq.com |
| 三級域名 | 123456@vip.qq.com |
根據(jù)上述常見郵箱格式,我們可以總結(jié)出郵箱格式符合的規(guī)則
1) 郵箱必有一個@
2) 郵箱@前綴由數(shù)字或字母開頭
3) 郵箱@前綴由多個字母、數(shù)字、段橫線-、下劃線_、英文句號.自由拼接而成
4) 郵箱@后綴由兩級或三級域名組成,其中每個域名中間由英文句號“.”隔開, 而每級域名都是由字母或數(shù)字組成
根據(jù)以上規(guī)則,可以得到如下正則表達式:
1) 郵箱必有一個@ ,對應(yīng)正則表達式如下所示:
@
2) 郵箱@前綴由數(shù)字或字母開頭,對應(yīng)正則表達式如下所示:
^[a-zA-Z0-9]@
其中^表示開始位置,[a-zA-Z0-9]表示數(shù)字或字母
3) 郵箱@前綴由多個字母、數(shù)字、段橫線-、下劃線_、英文句號.自由拼接而成
^[a-zA-Z0-9][a-zA-Z0-9-._]+@
其中+表示重復(fù)1到多次
4) 郵箱@后綴由兩級或三級域名組成,其中每個域名中間由英文句號“.”隔開,而每級域名都是由字母或數(shù)字組成。
@([a-zA-Z0-9]+.){1,2}[a-zA-Z0-9]+$
其中([a-zA-Z0-9]+.){1,2}可以拆分成如下內(nèi)容:
[a-zA-Z0-9] 數(shù)字或字母
[a-zA-Z0-9]+數(shù)字或字母重復(fù)1到多次
[a-zA-Z0-9]+.數(shù)字或字母重復(fù)1到多次后邊加上英文句號.
([a-zA-Z0-9]+.){1,2}數(shù)字或字母重復(fù)1到多次后邊加上英文句號.做為一個整體重復(fù)1到2次。
最后的[a-zA-Z0-9]+表示以多個數(shù)字或字母結(jié)尾。
將上述郵箱@前綴的正則表達式和郵箱@后綴的正則表達式組合在一起,同時由于0-9的數(shù)字可以用\d表示,可以用\d替換內(nèi)容中的0-9,最后得到的表達式我們想要的可以匹配郵箱的正則表達式,如下所示:
^[a-zA-Z\d][a-zA-Z\d-._]+@([a-zA-Z\d]+.){1,2}[a-zA-Z\d]+$
下面我們來檢驗下寫出來的正則表達式:
新建一個mail.txt,內(nèi)容如下:
ddddd@qq.com
其中最后三行為錯誤的格式,使用正則表達式進行校驗:

由上述結(jié)果可以看出,我們的正則表達式是符合要求的。
3.校驗手機號
要校驗手機號,我們首先需要知道手機號的組成格式。目前國內(nèi)的手機號有以下格式:
1)由數(shù)字1開頭
2)第二位數(shù)字的取值范圍是3、4、5、7、8、
3)最后為9位數(shù)字
根據(jù)以上規(guī)則,寫出對應(yīng)的正則表達式
- 由數(shù)字1開頭
^1
- 第二位數(shù)字的取值范圍是3、4、5、7、8、
[34578]
- 最后為9位數(shù)字
[0-9]{9}$
其中[0-9]{9}表示0-9的數(shù)字取值重復(fù)9次,$表示結(jié)尾。由于0-9的數(shù)字可以由\d表示,上述內(nèi)容等價于
\d{9}$
將上述正則表達式組合在一起,就可以得到我們想要的正則表達式,如下所示:
^1[34578]\d{9}$
下面開始進行校驗,新建一個phone.txt,內(nèi)容如下:
138537721989
146398702123
12200993333
23848270281
13849199233
d333300-903
其中只有倒數(shù)第二行的號碼是正確的,使用正則表達式進行校驗:

由上述結(jié)果可以看出,我們的正則表達式是符合要求的。
4.校驗IP地址
對IP地址進行嚴格校驗比較麻煩,首先要確定一個標準可用的IP地址需要滿足如下條件:
1) 由四組不大于255的數(shù)字組成,中間由“.”連接
2) 取值范圍為0.0.0.0-255.255.255.255
一個IP地址可以看成是四組0-255的數(shù)組中間由.隔開,進一步可以看成是0-255.重復(fù)三次(注意0-255后有點),后邊再跟上一個0-255的數(shù)字。
下面對0-255的數(shù)字可能的組成情況進行分析:
| 數(shù)字 | 取值 | 正則表達式 |
|---|---|---|
| 三位數(shù) | ||
| 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} |
| 二位數(shù) | ||
| 兩位數(shù) | 10-99 | [1-9]\d |
| 一位數(shù) | ||
| 一位數(shù) | 0-9 | \d |
將上述五種情況組合在一起就是我們想要的結(jié)果,這里注意五種情況之間是或的關(guān)系,用|連接,可以得到(0-255)的正則表達式如下:
(25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d
以上是一組0-255的數(shù)據(jù),上邊已經(jīng)分析了思路,IP由三組(0-255).和一組0-255組成,三組(0-255).就是(0-255).重復(fù)三次。
首先是(0-255).的表達式:
((25[0-5])|(2[0-4]\d)|(1\d{2})|([1-9]\d)|\d).
然后重復(fù)三次:
(((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)
為了更嚴謹點,需要加上開始和結(jié)束限定符,如下所示:
^(((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,內(nèi)容如下:
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地址是正確的,我們檢驗下剛才寫的正則表達式:

可以看到輸出結(jié)果達到了預(yù)期的效果,證明正則表達式是有效的。