首頁 > 軟體

十分鐘上手正規表示式 下篇

2021-10-13 19:01:24

前面,我們就正規表示式一些常用的基本方法做了詳細的介紹,本篇會講解一些拓展性的知識,主要的就是常見的ERE模式符號以及shell指令碼中常見的一些正規表示式例子。

快速學習正規表示式,不用死記硬背,範例讓你通透(上篇)

一、正規表示式常用符號

本章範例著重於在gawk程式指令碼中的較常見的ERE模式符號。

1.1 問號【?】

問號類似於星號,不過有點細微的不同。問號表明前面的字元可以出現 0 次或 1 次,但只限於 此。它不會匹配多次出現的字元。 範例展示:

指令碼解說:

如果字元 e 並未在文字中出現,或者它只在文字中出現了 1 次,那麼模式會匹配。

和星號一樣,可以將問號和字元組一起使用。

指令碼解說:

如果字元組中的字元出現了 0 次或 1 次,模式匹配就成立。但如果兩個字元都出現了,或者其中一個字元出現了2 次,模式匹配就不成立。

1.2 加號【+】

加號是類似於星號的另一個模式符號,但跟問號也有不同。加號表明前面的字元可以出現 1次或多次,但必須至少出現1 次。如果該字元沒有出現,那麼模式就不會匹配。

範例解說:

如果字元 e 沒有出現,模式匹配就不成立。加號同樣適用於字元組,與星號和問號的使用方式相同。

指令碼解讀:

如果字元組中定義的任一字元出現了,文字就會匹配指定的模式。

1.3 花括號{}

ERE 中的花括號允許為可重複的正規表示式指定一個上限。這通常稱為 間隔 ( interval )。 可以用兩種格式來指定區間。

  • m:正規表示式準確出現m次。
  • m, n:正規表示式至少出現m次,至多n次。

這個特性可以精確調整字元或字元集在模式中具體出現的次數。

重點說明:

預設情況下, gawk 程式不會識別正規表示式間隔。必須指定 gawk 程式的 --re- interval 命令列選項才能識別正規表示式間隔。

範例:

範例解讀:

通過指定間隔為 1 ,限定了該字元在匹配模式的字串中出現的次數。如果該字元出現多次, 模式匹配就不成立。

同樣也可以指定上限和下限

範例解讀:

字元 e 可以出現 1 次或 2 次,這樣模式就能匹配;否則,模式無法匹配。

下面是字元組的範例:

範例解讀:

如果字母 a 或 e 在文字模式中只出現了 1~2 次,則正規表示式模式匹配;否則,模式匹配失敗。

1.4 管道符號【|】

管道符號允許在檢查資料流時,用邏輯 OR 方式指定正規表示式引擎要用的兩個或多個模式。如果任何一個模式匹配了資料流文字,文字就通過測試。如果沒有模式匹配,則資料流文字匹配失敗。

使用格式:

expr1 |expr2|...

範例:

範例解讀:

這個例子會在資料流中查詢正規表示式 cat 或 dog 。正規表示式和管道符號之間不能有空格, 否則它們也會被認為是正規表示式模式的一部分。

管道符號兩側的正規表示式可以採用任何正規表示式模式(包括字元組)來定義文字。看下面範例:

範例解讀:

這個例子會匹配資料流文字中的 cat 、 hat 或 dog 。

1.5 小括號()

正規表示式模式也可以用圓括號進行分組。當將正規表示式模式分組時,該組會被視為一個標準字元。可以像對普通字元一樣給該組使用特殊字元。

範例:

範例解讀:

結尾的 urday 分組以及問號,使得模式能夠匹配完整的 Saturday 或縮寫 Sat 。

將分組和管道符號一起使用來建立可能的模式匹配組是很常見的做法。如下範例:

範例解讀:

模式 (c|b)a(b|t) 會匹配第一組中字母的任意組合以及第二組中字母的任意組合。

二、正規表示式實戰範例

範例1:

下面會有一個指令碼,功能是對PATH環境變數中定義的目錄裡的可執行檔案進行計數。

指令碼內容如下:

#!/bin/bash 
# count number of files in your PATH 
 
mypath=$(echo $PATH | sed 's/:/ /g') #用空格來替換冒號,分割路徑
count=0 
for directory in $mypath 
do 
 check=$(ls $directory) 
 for item in $check 
 do 
 count=$[ $count + 1 ] 
 done 
 echo "$directory - $count" 
 count=0 
done

執行結果:

範例2:

正規表示式解析郵件地址

郵件地址的基本格式為:[email protected]
username值可用字母數位字元以及以下特殊字元:(點號、單破折線、 加號、 下劃線)
在有效的郵件使用者名稱中,這些字元可能以任意組合形式出現。郵件地址的hostname部分由一個或多個域名和一個伺服器名組成。伺服器名和域名也必須遵照嚴格的命名規則,只允許字母數位字元以及以下特殊字元:(點號、下劃線)
伺服器名和域名都用點分隔,先指定伺服器名,緊接著指定子域名,最後是後面不帶點號的
頂級域名。
頂級域名的數量在過去十分有限,正規表示式模式編寫者會嘗試將它們都加到驗證模式中。
然而遺憾的是,隨著網際網路的發展,可用的頂級域名也增多了。這種方法已經不再可行。
從左側開始構建這個正規表示式模式。

過濾使用者名稱中表示式模式。

^([a-zA-Z0-9_-.+]+)@

這個分組指定了使用者名稱中允許的字元,加號表明必須有至少一個字元。下一個字元很明顯是@。

hostname模式使用同樣的方法來匹配伺服器名和子域名:

([a-zA-Z0-9_-.]+)

頂級域名用的正規表示式模式:

.([a-zA-Z]{2,5})$

整體組合模式:

^([a-zA-Z0-9_-.+]+)@([a-zA-Z0-9_-.]+).([a-zA-Z]{2,5})$

封裝到指令碼中:

cat isemail.sh

#!/bin/bash 
# script to filter out bad phone numbers 
awk --re-interval '/^([a-zA-Z0-9_-.+]+)@([a-zA-Z0-9_-.]+).([a-zA-Z]{2,5})/{print $0}'

注意:在awk程式中使用正規表示式間隔時,必須使用--re-interval命令列選項。

範例測試指令碼:

範例解讀:

符合規則的郵件名會列印在螢幕,不符合的會被過濾掉,不會有內容輸出。

到此這篇關於十分鐘上手正規表示式 下篇的文章就介紹到這了,更多相關正規表示式 入門內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com