
前面,我們就正則運算式一些常用的基本方法做了詳細的介紹,本篇會講解一些拓展性的知識,主要的就是常見的ERE模式符號以及shell腳本中常見的一些正則運算式例子,
快速學習正則運算式,不用死記硬背,示例讓你通透(上篇)_滌生手記-CSDN博客
一、正則運算式常用符號
本章示例著重于在gawk程式腳本中的較常見的ERE模式符號,
1.1 問號【?】
腳本解說:
如果字符 e 并未在文本中出現,或者它只在文本中出現了 1 次,那么模式會匹配,
腳本解說:
如果字符組中的字符出現了 0 次或 1 次,模式匹配就成立,但如果兩個字符都出現了,或者其中一個字符出現了2 次,模式匹配就不成立,
1.2 加號【+】
示例解說:
如果字符 e 沒有出現,模式匹配就不成立,加號同樣適用于字符組,與星號和問號的使用方式相同,

腳本解讀:
如果字符組中定義的任一字符出現了,文本就會匹配指定的模式,
1.3 花括號{}
- m:正則運算式準確出現m次,
- m, n:正則運算式至少出現m次,至多n次,
重點說明:
默認情況下, gawk 程式不會識別正則運算式間隔,必須指定 gawk 程式的 --re- interval 命令列選項才能識別正則運算式間隔,
示例:

示例解讀:
通過指定間隔為 1 ,限定了該字符在匹配模式的字串中出現的次數,如果該字符出現多次,模式匹配就不成立,
同樣也可以指定上限和下限

示例解讀:
字符 e 可以出現 1 次或 2 次,這樣模式就能匹配;否則,模式無法匹配,
下面是字符組的示例:

示例解讀:
如果字母 a 或 e 在文本模式中只出現了 1~2 次,則正則運算式模式匹配;否則,模式匹配失敗,
1.4 管道符號【|】
使用格式:
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: 正則運算式決議郵件地址
郵件地址的基本格式為:username@hostname
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命令列選項,
示例測驗腳本:

示例解讀:
符合規則的郵件名會列印在螢屏,不符合的會被過濾掉,不會有內容輸出,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/310554.html
標籤:java
下一篇:初識Java???
