在前端網頁開發與 HTML 表單互動中,驗證使用者輸入的數字、字串格式是常見的需求。無論是處理價格計算、欄位格式限制還是資料清理,JavaScript 正規表達式(Regular Expression)都是不可或缺的工具。本篇專為前端工程師與 RD(研發人員)打造,直接提供台灣手機號碼、Email、密碼強度等高頻使用的正規表達式語法、核心參數對照與生產環境複製即用範本。
⚡ 快速跳轉(依實務情境選擇):
核心複製即用範本與規格對照
為了讓開發者能在開發表單驗證時快速查找,本節直接整理 JavaScript 正規表達式(RegExp)中最核心的特殊字元與修飾詞(Flags)規格對照表。
| 核心維度 | 語法/符號 | 說明與作用 |
|---|---|---|
| 行首匹配 | ^ | 限制字串必須以該條件開頭。 |
| 行尾匹配 | $ | 限制字串必須以該條件結尾。 |
| 數字字元 | \d | 匹配任意單一數字(0-9)。 |
| 全域搜尋 | /g | 搜尋整個字串中所有符合條件的內容。 |
JavaScript 正規表達式基本語法與 Flags 修飾詞
在 JavaScript 中,正規表達式的宣告通常以斜線 / 作為開頭與結尾,或透過建構函式建立:
// 字面值寫法
let regex = /^\d{1,3}$/;
// 建構函式寫法
let regexObj = new RegExp(/^\d{1,3}$/);
注意:字面值寫法效能較佳,適合固定規則;建構函式則適合需動態組裝字串的規則。
RegExp Flags 修飾詞行為差異
當我們在正規表達式結尾加上不同的 Flags 時,會直接影響比對的範圍與行為:
let targetStr = " 123 abc ";
// 使用 /g (全域搜尋) 會取代所有符合的字元
let resultGlobal = targetStr.replace(/ /g, '');
console.log(resultGlobal); // 輸出 "123abc"
// 使用 /i (忽略大小寫)
let resultCase = targetStr.replace(/a/i, 'X');
console.log(resultCase); // 輸出 " 123 Xbc "(僅取代第一個找到的 A 或 a)
注意:/g 標記在 replace 方法中是移除所有符合項目的關鍵,若遺漏則僅會處理第一個符合的字元。
常見表單驗證生產環境範本
以下整理在實務開發中最高頻使用的各類表單驗證正規表達式,開發者可直接複製並根據專案需求進行調整。
1. 台灣手機號碼驗證
規定必須以 09 開頭,且後續接 8 位數字:
let phoneRegex = /^09\d{8}$/;
console.log(phoneRegex.test('0912345678')); // true
console.log(phoneRegex.test('0812345678')); // false
注意:此規則嚴格限制 10 位數且開頭為 09,若需支援國際碼(+886)請另行調整。
2. 純數字位數驗證
限制輸入必須為指定長度的純數字。關於限制 input 欄位只能輸入數字的詳細實作,可參照 RegExp 表單驗證 input 只輸入數字:
let numberRegex = /^\d{6}$/;
console.log(numberRegex.test('123456')); // true
console.log(numberRegex.test('12345')); // false
注意:\d 僅匹配 0-9,若輸入包含小數點或負號則會驗證失敗。
3. Email 電子郵件格式驗證
確保包含 @ 符號與網域結構:
let emailRegex = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
console.log(emailRegex.test('[email protected]')); // true
console.log(emailRegex.test('userexample.com')); // false
注意:此為基礎驗證,僅檢查結構合法性,無法確保該 Email 帳號真實存在。
4. 密碼強度驗證
規定長度為 6 到 16 字元,且必須同時包含至少一個大寫英文、小寫英文與數字:
let passwordRegex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,16}$/;
console.log(passwordRegex.test('Abc12345')); // true
console.log(passwordRegex.test('abc12345')); // false(缺少大寫字母)
注意:使用 (?=...) 正向先行斷言來強制檢查密碼組成,是確保安全強度的標準作法。
5. 帳號格式驗證
規定長度為 6 到 20 字元,開頭必須為大寫英文字母,且必須包含大小寫英文與數字:
let accountRegex = /^[A-Z]{1}(?=.*\d)(?=.*[a-zA-Z]).{6,20}$/;
console.log(accountRegex.test('A1b2c3d')); // true
console.log(accountRegex.test('a1b2c3d')); // false(開頭非大寫英文)
注意:此規則強制要求首字元為大寫,若帳號允許小寫開頭請移除 [A-Z]{1} 限制。
常見 Q&A
Q1:為什麼傳入空字串或 null 時,test() 方法會回傳 false?
Ans:當正規表達式開頭有設定 ^ 且結尾有 $ 時,代表字串必須完全符合該條件。空字串 ''、null、undefined 或 NaN 在進行轉型與長度比對時不符合模式,因此 test() 會回傳 false。
Q2:如何確保 input 輸入框完全不能輸入空白字元?
Ans:可以使用全域取代的方式,在使用者輸入觸發 input 事件時,利用 /g 修飾詞將空白過濾掉:
let cleanStr = userInput.replace(/\s/g, '');
注意:\s 包含所有空白字元(空格、Tab、換行),適合用於清理帳號或密碼欄位。
Q3:test() 與 match() 方法有什麼差別?
Ans:test() 回傳的是布林值(true / false),專門用於條件判斷與表單驗證;而 match() 則是回傳符合條件的陣列內容或 null,適用於需要擷取特定字串片段的場景。
參考資料與延伸閱讀
- MDN Web Docs:RegExp 全域物件與正規表達式語法指南
- MDN Web Docs:RegExp.prototype.test() 方法詳細規範
- MDN Web Docs:正規表達式中的斷言(Assertions)與先行斷言語法
- ECMAScript 2024 官方規範:RegExp (Regular Expression) Objects 章節
- WHATWG HTML Living Standard:input 欄位 pattern 屬性與正規表達式驗證機制
- 延伸閱讀:JavaScript 正規表達式:RegExp 物件比對、字串驗證機制與實作比較
- 延伸閱讀:Input RegExp 表單驗證 – 限制只能輸入數字 (oninput 與正規表達式)
1 則自動引用通知