regular expression正則表示法

最後更新:March 26, 2023

正則表示法與它的用途

文字處理常有截取關鍵資訊的需求,而最簡單的方式就是固定字元數量規則。例如:abc-987xyz-668,我們想得到下面兩個資料的數字部分,可以由左數來第4個字元開始截取資料,那麼得到的自然就是數字,但是資料格式常常不會這麼整齊,例如:abc-987gene-168,剛剛那套數數的方式就不管用了,這時就得有請正則表示法登場。正則表示法有訂定各種符號所代表的涵意,例如:/d表示09這類digit的數字;\s表示空白輸入,有了這些約定成俗的定義,我們就可以使用既定語法和條件,快速鎖定資料並截取我們要的部分,不僅精準度提升,使用彈性也較大。

正則表示法潛規則

套用正則之前,先掌握兩個原則,分別是這是什麼「類型」以及「數量」有多少。類型可分成數字、字母、大小寫、符號、空白,而數量可分成已知數量與未知。手機號碼格式固定,例如「886–911123123」就是3個數字、1個hyphen,最後再接9個數字。車牌號碼「BAG–5698」就是3個大寫字母、1個hyphen再接4個數字。而地址屬於未知數量,「忠孝東路33號」,「永和路555號」,不論是文字或是數字類型的數量都是未知的。

正則表示法的寫法也十分簡單,就是「類型+數量」形成一個區塊,整串文字的分析可由一個個區塊堆疊。例如正則表示為\[A-Z]{3}-\[0-9]{4}就是兩個區塊所組成,每個區塊用[ ]定義類型、用{ }指定數量,前面提到的車牌號碼「BAG–5698」就符合這個正則表示。

接下來我們會看到各式個樣的的正則表示符號,基本上[ ]裡表示類型,而{ }表示數量,有時為了方便會使用特殊符號替代。例如用\d代替[0–9]

正則表示法 – 數量

符號 匹配
{n} 匹配前一個項目重複符合n次
{n,m} 匹配前一個項目重複至少n次且不多於m次
{n,} 匹配前一個項目重複至少n次或更多
? 等同於{0,1},匹配前一個項目出現1次或0次
+ 等同{1,},,匹配前一個項目出現1次或多次
* 等同{0,},,匹配前一個項目出現0次或多次

正則表示法 – 類型

符號 匹配
[…] 中括號內任一字元
[^…] 中括號內字元之外的字元
. 除了換行符號\n之外的任何字元
w 等同[a-zA-Z0–9_],任何字母數字
W 等同[^a-zA-Z0–9],ASCII任何字元之外
s 空白字元
d 等同[0–9],任何數字
D 等同[^0–9],任何數字之外的字元

分組與擇一

符號 匹配
(…) 分組,將項目組成一個單元
| 擇一匹配,先匹配左邊若不匹配,則匹配右邊

字首字尾符合

符號 匹配
^ 匹配字串開頭
$ 匹配字串結尾

線上免費資源

對於正則不熟的朋友,推薦使用https://regex101.com/ ,好處是可以及時看自己寫的正則是否正確,不必靠程式執行結果來判斷,如此可節省許多時間。