iT邦幫忙

0

淺談正規表達式 (Regex) 的基本運作規則

  • 分享至 

  • xImage
  •  

第一次發文,選擇了困擾許久,卻在最近突然茅塞頓開的正規表達式,如果剛好有小白也深受正規表達式荼毒(?),希望有幸看到這篇文章能對您有所幫助。由於markdown還不是很熟練,排版很亂不優雅,還請見諒;以下就進入正文吧!

正規表達式 Regex

前言

正規表達式,相信對許多學程式的人來說,就跟看外星文一樣,然後就會覺得,啊我學這種鬼東西做什麼? (笑)。

在前端跟後端中,驗證這部分其實用在很多地方,諸如表單資訊、密碼強度跟長度等等,如果資料格式沒有經過驗證,會衍伸出很多問題;這時候正規表達式就派上用場了,以下是小弟自己跟AI討論後,自行吸收整理關於常用的正規表達式語法及應用範例

常用語法大全

正規表達式該怎麼寫呢?以 Javascript 為例,只要寫 // 就搞定了,要判斷的條件則就寫在兩條斜線之中

  1. 符號
    • + 代表前面的東西至少出現一次,常搭配 [] 使用,例如 [0-9]+ 代表至少出現一個數字
    • * 代表0次或多次,簡單說就是可有無,跟 + 一樣常搭配 [] 使用
    • ? 只能出現0次或1次,也可以解釋成最多只能出現一次
    • \ 轉義,後面常接有意義的符號;例如 \. 代表任意字元,如果想找 . 本身,就要寫成 \.,這樣程式就知道你要找那個點點了
    • [] 萬用百寶袋,你想要檢驗的條件通通都把他們塞入裡面,搭配前面的 + 等等,就可以用來判斷該出現哪些字元
    • {} : 限制次數的工具,通常加在要限制的對象後方;有分以下寫法:
      (1) {n} 非常常用!代表出現特定次數,例如 {3} 就是只能出現三次,不能多也不能少
      (2) {n,m} 代表最少要出現 n 次,最多只能出現 m 次,例如 {2,8}
      (3) {n, } : 常用!代表最少要出現 n 次,至於你總共要出現多少次都可以;例如 {2, } 代表至少出現2次就好
  • 懶人表格整理
語法 解說
+ 代表前面的東西至少出現一次
* 代表0次或多次,簡單說就是可有無
? 只能出現0次或1次,也可以解釋成最多只能出現一次
\ 轉義,後面常接有意義的符號;例如 \. 代表找尋點的符號
{} 限制次數,常用語法有 {n} {n,m} {n, }
[] 檢驗的條件全部寫入裡面,是一個集合條件,其中一個成立即可
  1. 關鍵字
    • . : 最強大、但也需要慎用的符號,他可以代表任何除了「換行符號」以外的任何字元,他出現的位置就可以代表任何人
    • d 代表 0-9 的數字
    • \w 代表所有大小寫英文字母、數字以及底線,等同於 [A-Za-z0-9_] (這寫法就是條件全部寫入[],裡面代表什麼後面會提到)
    • \s 反斜線加上小寫 s,代表空格
    • \S 注意是大寫 s,代表非空格的任何字元;例如 /\S{3}/ 就是判斷字串是否不含空格、且長度為 3
    • ^ 起始符號,通常搭配 $ 一起使用,用以限縮判斷範圍
    • $ 終止符號,通常搭配 ^ 一起使用,用以限縮判斷範圍;常用的組合技範例: /^\d{5}$/ 代表就是要符合5個數字,不要有其他亂七八糟的東西

後面會再用實例來說明

  1. 常用分類

    • 大寫字母 : 用 A-Z 表示,代表從A到Z的任何英文字母;當然也可以縮小範圍,例如 C-FCDEF
    • 小寫字母 : 用 a-z 表示,用法同大寫字母
    • 數字 : 用 0-9 表示,用法原理與英文字母一樣
  2. 正向斷言 (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 後方

情境二 信箱

這個可以分成簡易判斷、以及詳細判斷(後端,通常還會包含網域,這裡先不考慮網域)

  1. 陽春判斷型 (只適用於簡易判斷是否含 @, 比較嚴謹的建議用下面一種方法)
    /^\S+@\S+\.\S+$/

  2. 較為嚴謹、正式的常用判斷式 (參考,這會擋掉一些合法但不正式的email格式)
    /^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z]{2,}$/

  • 開頭跟結尾用 /^$ 包起來確保完整性
  • 主要判斷結構是否符合 任意英文跟數字或底線組成的字串 @ 任意英文跟數字或底線組成的字串 . 至少兩個英文字(通常代表網域),例如 s12A34567@hotmail.com
  1. 用 validator.js
    好套件不用嗎?站在巨人肩膀可以省下很多功夫!可以參考這篇文件

情境三 信用卡號

一般都是16碼數字加上 - 組成,例如XXXX-XXXX-XXXX-XXXX,主要卡別如Visa以4開頭,Mastercard為51-55開頭,JCB為3528-3589開頭

這裡以 Visa/Mastercard 驗證作範例 (以一般 16 碼為例),條件如下

  • 必須以 4 做開頭
  • 每四個數字為區隔,中間用 - 隔開
  • 總共 16 個數字

/^(4\d{3}|5[1-5]\d{2})(\-\d{4}){3}$/

  • 開頭跟結尾用 /^$ 包起來確保完整性
  • ()搭配 |來包可能的條件集合,()| 區隔 4\d{3}5[1-5]\d{2}
  • 第一種是 Visa,第二種是Mastercard;[1-5]後面沒寫 + 就代表默認是重複一次,也就是1-5其中一個數字
  • \d{n} 比較沒問題,代表數字要有 n 個
  • (\-\d{4}){3} 代表 \-\d{4} 這個結構重複 3 次;也可以寫成 \-\d{4}\-\d{4}\-\d{4} ,但看起來是不是有點煩躁?

實際程式碼撰寫應用

在Javascript中,正規表達式最常搭配 .test() 使用;語法為
Regex.test(String)

  • Regex 是正規表達式
  • String是要被驗證的字串
  • 會回傳 truefalse (布林值)

以手機號碼驗證為範例:
/^09\d{8}$/.test(0912345678) -> true ,驗證通過
/^09\d{8}$/.test(0812345678) -> false ,開頭不是 09
/^09\d{8}$/.test(1234567) -> false ,開頭既不是 09,也不符合後面 8 個數字的格式

進階應用

  1. 條件判斷

    • () 包含特定字元集合,例如今天寫 (abc)+ 代表 至少出現一次 "abc" 這個連體嬰;舉例 "XDabcKK" 用 /(abc)+/ 可以判定成功,但 "XDaKKbc" 或 "XDabKKc" 就會判定失敗
    • OR運算子 | 今天寫 (cat | dog) 就可以同時判斷字串中是否包含 "cat" 或 "dog"
    • [^ 條件] 排除語法,與起始符號 ^ 不一樣,放在 [] 裡代表排除;例如 [^A-Z] 就代表大寫英文字母以外的任何字元 (排除大寫英文字母)
  2. 修飾語法

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 就像一把瑞士刀,你不需要每天磨它,但當你需要精準切開資料字串時,你會慶幸自己掌握了這門手藝。如果忘記了語法,隨時回來翻這篇筆記就對了!有問題歡迎隨時交流及指點,感謝閱讀!


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言