本文章由尚學堂旗下雲數學院周老師做內容指導,薛同學編輯,如需轉載,請標明出處。 QQ技術交流群:299142667 前言 使用man grep查看grep的幫助文檔,有如下內容: 可以看出,正則表達式由三類,分別是 基本的正則表達式(Basic Regular Expression 又叫 Basic ...
本文章由尚學堂旗下雲數學院周老師做內容指導,薛同學編輯,如需轉載,請標明出處。
QQ技術交流群:299142667
前言
使用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.校驗郵箱地址
下表是常見的郵箱格式
@首碼 |
純數字 |
|
純字母 |
||
字母數字混合 |
||
帶點的 |
||
帶下劃線 |
||
帶連接線 |
||
@尾碼 |
二級功能變數名稱 |
|
三級功能變數名稱 |
根據上述常見郵箱格式,我們可以總結出郵箱格式符合的規則
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,內容如下:
其中最後三行為錯誤的格式,使用正則表達式進行校驗:
由上述結果可以看出,我們的正則表達式是符合要求的。
3.校驗手機號
要校驗手機號,我們首先需要知道手機號的組成格式。目前國內的手機號有以下格式:
1)由數字1開頭
2)第二位數字的取值範圍是3、4、5、7、8、
3)最後為9位數字
根據以上規則,寫出對應的正則表達式
1) 由數字1開頭
^1
2) 第二位數字的取值範圍是3、4、5、7、8、
[34578]
3) 最後為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地址是正確的,我們檢驗下剛纔寫的正則表達式:
可以看到輸出結果達到了預期的效果,證明正則表達式是有效的。
如需轉載請標明出處:http://www.cnblogs.com/sxt-zkys/
QQ技術交流群:129518033