第一次發文,選擇了困擾許久,卻在最近突然茅塞頓開的正規表達式,如果剛好有小白也深受正規表達式荼毒(?),希望有幸看到這篇文章能對您有所幫助。由於markdown還不是很熟練,排版很亂不優雅,還請見諒;以下就進入正文吧!
正規表達式,相信對許多學程式的人來說,就跟看外星文一樣,然後就會覺得,啊我學這種鬼東西做什麼? (笑)。
在前端跟後端中,驗證這部分其實用在很多地方,諸如表單資訊、密碼強度跟長度等等,如果資料格式沒有經過驗證,會衍伸出很多問題;這時候正規表達式就派上用場了,以下是小弟自己跟AI討論後,自行吸收整理關於常用的正規表達式語法及應用範例
正規表達式該怎麼寫呢?以 Javascript 為例,只要寫 // 就搞定了,要判斷的條件則就寫在兩條斜線之中
+ 代表前面的東西至少出現一次,常搭配 [] 使用,例如 [0-9]+ 代表至少出現一個數字* 代表0次或多次,簡單說就是可有無,跟 + 一樣常搭配 [] 使用? 只能出現0次或1次,也可以解釋成最多只能出現一次\ 轉義,後面常接有意義的符號;例如 \. 代表任意字元,如果想找 . 本身,就要寫成 \.,這樣程式就知道你要找那個點點了[] 萬用百寶袋,你想要檢驗的條件通通都把他們塞入裡面,搭配前面的 + 等等,就可以用來判斷該出現哪些字元{} : 限制次數的工具,通常加在要限制的對象後方;有分以下寫法:{n} 非常常用!代表出現特定次數,例如 {3} 就是只能出現三次,不能多也不能少{n,m} 代表最少要出現 n 次,最多只能出現 m 次,例如 {2,8}{n, } : 常用!代表最少要出現 n 次,至於你總共要出現多少次都可以;例如 {2, } 代表至少出現2次就好| 語法 | 解說 |
|---|---|
+ |
代表前面的東西至少出現一次 |
* |
代表0次或多次,簡單說就是可有無 |
? |
只能出現0次或1次,也可以解釋成最多只能出現一次 |
\ |
轉義,後面常接有意義的符號;例如 \. 代表找尋點的符號 |
{} |
限制次數,常用語法有 {n} {n,m} {n, }等 |
[] |
檢驗的條件全部寫入裡面,是一個集合條件,其中一個成立即可 |
. : 最強大、但也需要慎用的符號,他可以代表任何除了「換行符號」以外的任何字元,他出現的位置就可以代表任何人d 代表 0-9 的數字\w 代表所有大小寫英文字母、數字以及底線,等同於 [A-Za-z0-9_] (這寫法就是條件全部寫入[],裡面代表什麼後面會提到)\s 反斜線加上小寫 s,代表空格\S 注意是大寫 s,代表非空格的任何字元;例如 /\S{3}/ 就是判斷字串是否不含空格、且長度為 3^ 起始符號,通常搭配 $ 一起使用,用以限縮判斷範圍$ 終止符號,通常搭配 ^ 一起使用,用以限縮判斷範圍;常用的組合技範例: /^\d{5}$/ 代表就是要符合5個數字,不要有其他亂七八糟的東西後面會再用實例來說明
常用分類
A-Z 表示,代表從A到Z的任何英文字母;當然也可以縮小範圍,例如 C-F 或 CDEF
a-z 表示,用法同大寫字母0-9 表示,用法原理與英文字母一樣正向斷言 (Lookahead)
這個最常應用的地方,就是判斷密碼強度,他的語法是 (?=.*[條件]),斷言本身不會佔據位置,類似站在原地看整個字串;
?= 代表要開始看了.* 代表跳過任意數量字元[A-Z] 是你想找的東西(條件),前面的 ?= 只是告訴程式「現在開始往後看囉」例如今天寫/(?=.*[A-Z])\S{10}/ 他會先行往後檢查是否有大寫字母,如果都沒有大寫字母就直接判定不符合條件;如果有大寫字母就會在檢查完後,再去是否有不含空格的10個任意字元;正向斷言就好比是開門的鑰匙,鑰匙不匹配後面就什麼都不用說了
正向斷言中,一個()裡通常只判斷一個條件 (能不能一次塞多個這我沒測試過),可以多個條件連在一起判斷;例如 /(?=.*[a-z])(?=.*[0-9])/ 就是判斷整個字串是否至少含一個小寫字母、以及是否至少含一個數字
| 語法 | 解說 |
|---|---|
. |
代表除了「換行符號」以外的任何字元 |
\d |
代表 0-9 的數字 |
\s |
空格 |
\S |
非空格的任何字元 |
^ |
完整敘述起始符號,通常搭配 $ 一起使用 |
$ |
完整敘述終止符號,通常搭配 ^ 一起使用 |
手機號碼通常都是「09」開頭,搭配後面 8 個數字,共 10 碼;所以可以這麼寫/^09\d{8}$/
/^ 和 $ 包起來確保完整性\d 代表數字 0-9{8} 代表數字要有 8 個,接在條件 \d 後方這個可以分成簡易判斷、以及詳細判斷(後端,通常還會包含網域,這裡先不考慮網域)
陽春判斷型 (只適用於簡易判斷是否含 @, 比較嚴謹的建議用下面一種方法)/^\S+@\S+\.\S+$/
較為嚴謹、正式的常用判斷式 (參考,這會擋掉一些合法但不正式的email格式)/^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z]{2,}$/
/^ 和 $ 包起來確保完整性任意英文跟數字或底線組成的字串 @ 任意英文跟數字或底線組成的字串 . 至少兩個英文字(通常代表網域),例如 s12A34567@hotmail.com
一般都是16碼數字加上 - 組成,例如XXXX-XXXX-XXXX-XXXX,主要卡別如Visa以4開頭,Mastercard為51-55開頭,JCB為3528-3589開頭
這裡以 Visa/Mastercard 驗證作範例 (以一般 16 碼為例),條件如下
- 隔開/^(4\d{3}|5[1-5]\d{2})(\-\d{4}){3}$/
/^ 和 $ 包起來確保完整性()搭配 |來包可能的條件集合,() 以 | 區隔 4\d{3} 跟 5[1-5]\d{2}
[1-5]後面沒寫 + 就代表默認是重複一次,也就是1-5其中一個數字\d{n} 比較沒問題,代表數字要有 n 個(\-\d{4}){3} 代表 \-\d{4} 這個結構重複 3 次;也可以寫成 \-\d{4}\-\d{4}\-\d{4} ,但看起來是不是有點煩躁?在Javascript中,正規表達式最常搭配 .test() 使用;語法為Regex.test(String)
true 或 false (布林值)以手機號碼驗證為範例:/^09\d{8}$/.test(0912345678) -> true ,驗證通過/^09\d{8}$/.test(0812345678) -> false ,開頭不是 09/^09\d{8}$/.test(1234567) -> false ,開頭既不是 09,也不符合後面 8 個數字的格式
條件判斷
() 包含特定字元集合,例如今天寫 (abc)+ 代表 至少出現一次 "abc" 這個連體嬰;舉例 "XDabcKK" 用 /(abc)+/ 可以判定成功,但 "XDaKKbc" 或 "XDabKKc" 就會判定失敗OR運算子 | 今天寫 (cat | dog) 就可以同時判斷字串中是否包含 "cat" 或 "dog"[^ 條件] 排除語法,與起始符號 ^ 不一樣,放在 [] 裡代表排除;例如 [^A-Z] 就代表大寫英文字母以外的任何字元 (排除大寫英文字母)修飾語法
Javascript中,常常在 // 後面加上判斷旗標,常用的旗標說明如下
g (Global):全域搜索;例如寫 /\d+/g 會去找所有數字,不寫 g 就只會找出第一個數字;範例:我有 1 台電腦跟 2 支手機,有寫 g 會找出 ["1", "2"],沒寫就只會找出 ["1"]i (Ignore Case):不區分大小寫;範例: /cake/i,以下都會符合條件:"CAKE"、"cake"、"Cake"等等Regex 正規表達式不是靠硬背的,而是用來「解決問題」的。
初次接觸正規表達式,覺得像外星文是完全正常的。這篇筆記的目的是幫你建立「語感」,讓你在未來的開發路徑上(無論是 Vue 的前端表單,還是 Node.js 的後端驗證等),遇到資料格式問題時,知道有哪些工具可以調用。
記住,Regex 就像一把瑞士刀,你不需要每天磨它,但當你需要精準切開資料字串時,你會慶幸自己掌握了這門手藝。如果忘記了語法,隨時回來翻這篇筆記就對了!有問題歡迎隨時交流及指點,感謝閱讀!