天天看點

大資料Shell程式設計 之 常用正規表達式

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

大資料Shell程式設計 之 常用正規表達式

可以看出,正規表達式由三類,分别是

  • 基本的正規表達式(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位址,檢測結果如下:

大資料Shell程式設計 之 常用正規表達式

由以上結果可以看出上述正規表達式是正确的。

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]

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

[email protected].

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

大資料Shell程式設計 之 常用正規表達式

由上述結果可以看出,我們的正規表達式是符合要求的。

3.校驗手機号

要校驗手機号,我們首先需要知道手機号的組成格式。目前國内的手機号有以下格式:

1)由數字1開頭

2)第二位數字的取值範圍是3、4、5、7、8、

3)最後為9位數字

根據以上規則,寫出對應的正規表達式

  1. 由數字1開頭

^1

  1. 第二位數字的取值範圍是3、4、5、7、8、

[34578]

  1. 最後為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

其中隻有倒數第二行的号碼是正确的,使用正規表達式進行校驗:

大資料Shell程式設計 之 常用正規表達式

由上述結果可以看出,我們的正規表達式是符合要求的。

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位址是正确的,我們檢驗下剛才寫的正規表達式:

大資料Shell程式設計 之 常用正規表達式

可以看到輸出結果達到了預期的效果,證明正規表達式是有效的。

連結:https://www.jianshu.com/p/e27d46e675a8