正規表示式筆記

此篇未提及部分請看參考資料

簡介

  • Regular Expressions 可簡稱為 regexp 、regex 或 RE
    • 常見的翻譯有 正規表示式(台灣)、正則表達式(中國)
  • 意譯為「字串樣版」,是處理 “有規律的文字檔” 的工具
  • 現在的標準已經被ISO(國際標準組織)批准和被Open Group組織認定(POSIX 1003.2)

用途

利用RE指定搜尋的字串樣式,然後從檔案中找出符合該樣式的字串,並加以處理

  • 將檔案中類似的字串取代掉
    • color → colour
  • 檢查使用者輸入是否符合指定樣式
    • Email格式檢查
  • 更改顯示格式
    • 12/06/2006 → 2006-12-06
  • 語法剖析
  • 搜尋檔案
    • everything in Windows

注意事項

  • 處理的資料必須是文字格式,如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 個月(19, 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搜尋檔案內容

  • 在當前目錄尋找包含輸出函式printffprintf的檔案: grep -Ern 'f?printf' .
    • -E 使用正規表示式
    • -r 遞迴搜尋(子目錄)
    • -n 列出行數
    • 加入尋找sprintf
      • grep -Ern '[sf]?printf' .

參考資料

  • regexp介紹
  • 簡易圖片教學
  • regexp-轉載自張智星教學網站
  • 朱孝國–正規表示式原理及應用
  • 鳥哥
  • java.util.regex.Pattern支援的正則表示式
  • 洪朝貴:字串樣版 Regexp: 兼談長線學習投資
  • regex101 - 線上RE測試平台
  • 常用的正規表示式