【深入淺出Linux】常用正則表達式校驗

前言

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

image

可以看出,正則表達式由三類,分別是

  • 基本的正則表達式(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é)果如下:

image

由以上結(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)容如下:

12345@qq.com

zhangsan@qq.com

zhang.san@qq.com

zhang_san@qq.com

zhang123@qq.com

123zhang@qq.com

zhangsan@vip.qq.com

zhang-san@qq.com

_dfsdfds@qq.com

ddddd@qq.com

zhangsan@vip.qq.com.

其中最后三行為錯誤的格式,使用正則表達式進行校驗:

image

由上述結(jié)果可以看出,我們的正則表達式是符合要求的。

3.校驗手機號

要校驗手機號,我們首先需要知道手機號的組成格式。目前國內(nèi)的手機號有以下格式:

1)由數(shù)字1開頭

2)第二位數(shù)字的取值范圍是3、4、5、7、8、

3)最后為9位數(shù)字

根據(jù)以上規(guī)則,寫出對應(yīng)的正則表達式

  1. 由數(shù)字1開頭

^1

  1. 第二位數(shù)字的取值范圍是3、4、5、7、8、

[34578]

  1. 最后為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ù)第二行的號碼是正確的,使用正則表達式進行校驗:

image

由上述結(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地址是正確的,我們檢驗下剛才寫的正則表達式:

image

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容