正規表達式(Regular Expression,Regex)的語法本身不難,但要從零寫出一個「正確」的驗證 Pattern,卻需要考慮大量邊界情況。本文不再解釋語法,而是直接給你可立即使用的實戰 Pattern,每個都附上說明、邊界案例與注意事項。可搭配正規表達式工具直接貼入測試。
一、Email 地址驗證
Email 格式看似簡單,但完整的 RFC 5322 標準極其複雜。以下是實務上「夠用」的版本,覆蓋 99% 的真實 Email 格式:
/^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/
| 測試字串 | 結果 | 說明 |
|---|---|---|
| [email protected] | ✅ 通過 | 標準格式 |
| [email protected] | ✅ 通過 | 含加號、子網域 |
| user@example | ❌ 拒絕 | 缺少頂層網域 |
| @example.com | ❌ 拒絕 | 缺少本地端 |
| user @example.com | ❌ 拒絕 | 含空格 |
注意:Email 驗證的最終方案是寄送確認信,Regex 只能排除明顯格式錯誤,無法驗證信箱是否真實存在。
二、台灣手機號碼
/^09\d{8}$/
台灣手機號碼格式固定為 09 開頭,共 10 碼。若需支援國際格式(+886):
/^(\+886|0)9\d{8}$/
| 測試字串 | 結果 |
|---|---|
| 0912345678 | ✅ 通過 |
| +886912345678 | ✅ 通過(國際格式) |
| 091234567 | ❌ 位數不足 |
| 0812345678 | ❌ 非 09 開頭 |
三、日期格式(YYYY-MM-DD)
/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/
這個 Pattern 會驗證月份(01–12)和日期(01–31)的合法範圍,但無法驗證該月實際有幾天(例如 2023-02-30 仍會通過)。精確的日期有效性仍需程式邏輯處理。
| 測試字串 | 結果 |
|---|---|
| 2024-01-15 | ✅ 通過 |
| 2024-12-31 | ✅ 通過 |
| 2024-13-01 | ❌ 月份超範圍 |
| 2024/01/15 | ❌ 分隔符號不符 |
| 24-01-15 | ❌ 年份位數不足 |
四、URL 網址
/^https?:\/\/[^\s/$.?#].[^\s]*$/i
這個 Pattern 覆蓋 http 和 https,允許複雜的路徑、查詢參數與 hash,並排除含空格的無效網址。若只允許 HTTPS:
/^https:\/\/[^\s/$.?#].[^\s]*$/i
五、IPv4 位址
/^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/
這個 Pattern 精確驗證每個 octet 的範圍(0–255),避免 999.999.999.999 這類格式正確但數值無效的情況。
| 測試字串 | 結果 |
|---|---|
| 192.168.1.1 | ✅ 通過 |
| 255.255.255.0 | ✅ 通過 |
| 256.0.0.1 | ❌ 數值超範圍 |
| 192.168.1 | ❌ 只有三段 |
六、密碼強度規則
密碼規則因需求不同,以下提供三種常見等級:
基本(至少 8 位,含字母與數字):
/^(?=.*[a-zA-Z])(?=.*\d).{8,}$/
中等(至少 8 位,含大小寫字母與數字):
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/
嚴格(至少 8 位,含大小寫、數字與特殊字元):
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$/
以上使用前向斷言(Lookahead (?=...))來確認包含特定字元類型,但不限制它們出現的位置。
七、純數字格式
正整數(不含負號、小數點):
/^\d+$/
整數(含負號):
/^-?\d+$/
浮點數(含負號與小數):
/^-?\d+(\.\d+)?$/
這些 Pattern 常用於表單的數量欄位、金額輸入等場景。
八、中文字符(CJK 統一表意文字)
/^[\u4e00-\u9fff]+$/
此範圍涵蓋 Unicode CJK 統一表意文字的主要區段(U+4E00 至 U+9FFF),適合驗證「純中文」輸入(如姓名欄位)。若需同時允許日文假名或韓文字元,需擴展範圍:
/^[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]+$/
九、台灣身分證字號
/^[A-Z][12]\d{8}$/
台灣身分證格式:第一碼為大寫英文字母(地區碼)、第二碼為 1(男性)或 2(女性)、後 8 碼為數字,共 10 碼。
注意:Regex 只能驗證格式,無法驗證檢查碼(第 10 碼)的正確性。格式正確的身分證號碼仍可能是不存在的號碼,完整驗證需搭配加權計算。
十、移除 HTML 標籤
/<[^>]+>/g
這個 Pattern 用於「替換」而非「匹配」,搭配空字串替換可移除文字中的 HTML 標籤。例如在 JavaScript 中:
const cleanText = htmlString.replace(/<[^>]+>/g, '');
注意:不建議用 Regex 解析完整的 HTML 結構,因為 HTML 並非正規語言——巢狀標籤、自閉合標籤等結構都可能造成 Pattern 失效。完整的 HTML 解析應使用 DOM Parser。
常見錯誤與注意事項
1. 忘記開頭 ^ 與結尾 $
缺少錨點的 Pattern 只要「部分匹配」就會通過。例如 /\d+/ 會讓 abc123 通過,因為字串中包含數字。加上 ^ 和 $ 才能確保整個字串符合格式。
2. 過度嚴格的 Pattern 造成誤拒
Email 最新的頂層網域名稱(如 .taipei、.photography)可能超過 4 個字元。使用 {2,} 而非固定的 {2,4} 可以避免誤拒合法 Email。
3. 大小寫敏感性
URL Pattern 加上 i 旗標(不區分大小寫),Email Pattern 則通常應維持大小寫敏感(使用 [a-zA-Z] 明確指定兩種情況)。
4. 語言平台的差異
不同程式語言對 Regex 的語法支援有細微差異。例如 JavaScript 不支援 Lookbehind 斷言(舊版本),Python 的 re 模組在多行模式下 ^ 和 $ 的行為與 JavaScript 不同。跨語言使用前務必測試。
總結
正規表達式的核心技能是「知道從哪裡找到可靠的 Pattern,並理解它的限制」。直接使用已驗證的 Pattern 比從頭撰寫更安全,因為邊界情況的處理往往比你想像的複雜。