此篇未提及部分請看參考資料
簡介
- Regular Expressions 可簡稱為 regexp 、regex 或 RE
- 常見的翻譯有 正規表示式(台灣)、正則表達式(中國)
- 意譯為「字串樣版」,是處理 “有規律的文字檔” 的工具
- 現在的標準已經被ISO(國際標準組織)批准和被Open Group組織認定(POSIX 1003.2)
用途
利用RE指定搜尋的字串樣式,然後從檔案中找出符合該樣式的字串,並加以處理
- 將檔案中類似的字串取代掉
- 檢查使用者輸入是否符合指定樣式
- 更改顯示格式
- 語法剖析
- 搜尋檔案
注意事項
- 處理的資料必須是文字格式,如txt, html, csv,…等開放格式
- 通常以斜線(
//
)或引號(""
)將RE含括起來
- 對中文資料(big5)處理還有問題
- RE有基本型與延伸型,某些工具只支援基本型時,延伸型的語法便不能使用
- Unix like下的工具大都內建RE,Windows下的工具比較少,但也有逐漸增多的趨勢
哪些軟體使用正規表示式?
- unix工具:
grep
, sed
, awk
…
- 編輯器:
vi
, emacs
, notepad++
…
- 程式語言:
Java
, Python
, Ruby
…
正規表示式規則
位置和量詞
字元 |
說明 |
範例 |
\b |
英文字的邊界(空格,逗號等符號) |
Example |
\B |
非邊界 |
Example |
^ |
表示位置在開頭 |
^A 可比對 「Abcd」 中的 「A」,但不可比對 「aAb」 |
$ |
表示位置在結尾 |
A$ 可比對 「bcdA」 中的 「A」,但不可比對 「aAb」 |
* |
比對前一個字零次或更多次 |
bo* 可比對 「Good boook」 中的 「booo」,亦可比對 「Good bk」 中的 「b」 |
+ |
比對前一個字一次或更多次 |
a+ 可比對 「caaandy」 中的 「aaa」,但不可比對 「cndy」 |
? |
比對前一個字零次或一次 |
e?l 可比對 「angel」 中的 「el」,也可以比對 「angle」 中的 「l」 |
{} |
表示前面的字元或集合出現的次數 |
c{5,8} ,代表c這個字重複出現5到8次
.{5, } ,代表至少5個字元的字串 |
集合
字元 |
說明 |
範例 |
[ ] |
代表集合中的任一字元 |
[01256] 代表0,1,2,5,6這個集合中的任何一個字元 |
- |
在中括號內表示「範圍」 |
[0-9] 代表0到9的任一個單一的數字 |
^ |
在中括號內表示「否定」 |
[^aeiou] 代表除了a,e,i,o,u之外的字元 |
[a-zA-Z0-9]
的寫法也是可行的
[a-z&&[^bc]]
代表除了b, c以外的小寫英文單字
- 「|」 表示OR,如
cat|dog|bird
代表cat, dog, bird
簡寫
特殊字元:用來當作特殊符號的字元,如上面的*
, $
等。若要搜尋這些字元,必須在其前方加上\跳脫字元(Ex. 若要比對 “^” ,使用 \^
)
字元 |
說明 |
等價範圍 |
\d |
數字 |
[0-9] |
\D |
非數字 |
[^0-9] |
\w |
數字、字母、底線 |
[a-zA-Z0-9_] |
\W |
非 \w |
[^a-zA-Z0-9_] |
\n |
換行符號 |
[\n] |
\s |
空白字元(tab, 換行等) |
[ \t\n\x0B\f\r] |
\S |
非空白字元 |
[^ \t\n\x0B\f\r] |
. |
代表任意一個字元(除了換行符號) |
|
其他
字元 |
說明 |
範例 |
(x) |
將x儲存 |
(a*) and (b*) 可找出「aaa and bb」 中的 「aaa」 和 「bb」,並將其儲存 |
\t |
定位字元(Tab) |
|
\ooctal |
八進位,其中octal是八進位數目 |
\ooctal123 可比對 與 八進位的ASCII中 「123」 所相對應的字元值。 |
\xhex |
十六進位,其中hex是十六進位數目 |
\xhex38 可比對 與 16進位的ASCII中 「38」 所相對應的字元。 |
\cX |
控制字元,其中 X 是一個控制字元 |
\cM 可以比對’control-M’ |
正規表示式範例
- 數字或無輸入:
^[0-9]*$
- m~n 個數字:
^\d{m,n}$
- 0和非零開頭的數字:
^0|[1-9][0-9]*$
- 有兩位小數的正實數:
^[0-9]+(.[0-9]{2})?$
- 非零的正整數:
^\+?[1-9][0-9]*$
- 非零的負整數:
^\-[1-9][0-9]*$
- 數字、26 個英文字母或者下劃線:
^\w+$
- 驗證用戶密碼 – 以字母開頭,長度在 6~18 之間,只能包含字符、數字和下劃線:
^[a-zA-Z]\w{5,17}$
- 只能輸入漢字:
^[\u4e00-\u9fa5]{0,}$
- 驗證 Email 地址:
^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$
- 驗證 URL:
^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
- 驗證一年的 12 個月(1
9, 0109, 10~12):^(0?[1-9]|1[0-2])$
- 驗證一個月的 31 天(01~09, 1~31):
^((0?[1-9])|((1|2)[0-9])|30|31)$
- 驗證 IP位址:
^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$
以grep搜尋檔案內容
- 在當前目錄尋找包含輸出函式
printf
或fprintf
的檔案: grep -Ern 'f?printf' .
-E
使用正規表示式
-r
遞迴搜尋(子目錄)
-n
列出行數
- 加入尋找
sprintf
grep -Ern '[sf]?printf' .
參考資料
- regexp介紹
- 簡易圖片教學
- regexp-轉載自張智星教學網站
- 朱孝國–正規表示式原理及應用
- 鳥哥
- java.util.regex.Pattern支援的正則表示式
- 洪朝貴:字串樣版 Regexp: 兼談長線學習投資
- regex101 - 線上RE測試平台
- 常用的正規表示式