正規表達式實戰大全:Email、電話、日期格式的常用驗證 Pattern 完整整理

正規表達式(Regular Expression,Regex)的語法本身不難,但要從零寫出一個「正確」的驗證 Pattern,卻需要考慮大量邊界情況。本文不再解釋語法,而是直接給你可立即使用的實戰 Pattern,每個都附上說明、邊界案例與注意事項。可搭配正規表達式工具直接貼入測試。

如何使用本文:每個 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
立即測試:把你的網址清單貼到正規表達式工具,選擇「多行模式」逐行驗證,快速篩選格式錯誤的 URL。

五、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。

立即試用這些 Pattern:開啟正規表達式工具,把上面任一 Pattern 貼入「正規表達式」欄位,再把你的測試資料貼到「測試字串」區塊,即時看到哪些字串通過、哪些被拒絕。

常見錯誤與注意事項

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 比從頭撰寫更安全,因為邊界情況的處理往往比你想像的複雜。

  • 所有 Pattern 都可在正規表達式工具中即時測試
  • 驗證的最終防線仍在伺服器端——Regex 只是前端的第一道篩選
  • 複雜的驗證邏輯(日期有效性、身分證檢查碼)需搭配程式邏輯,Regex 只處理「格式」
  • 對照比較兩段 Regex Pattern 的差異,可用文字比對工具快速找出不同之處