正則表達式以強大的模式匹配能力,成為資料驗證、文字搜尋/替換、垃圾郵件過濾的利器。本文整理核心語法、常用驗證模式與實戰建議。
| 語法 | 說明 | 範例 |
|---|---|---|
\ | 轉義字元 | \. 匹配點號 |
^ | 字串開頭 (多行模式匹配行首) | ^A 以 A 開頭 |
$ | 字串結尾 (多行模式匹配行尾) | Z$ 以 Z 結尾 |
* | 零次或多次 ({0,}) | ab*c 匹配 ac, abc, abbc... |
+ | 一次或多次 ({1,}) | ab+c 匹配 abc, abbc... |
? | 零次或一次 ({0,1}) | ab?c 匹配 ac, abc |
{n} | 恰好 n 次 | \d{4} 4 位數字 |
{n,} | 至少 n 次 | \d{2,} 至少 2 位數字 |
{n,m} | n 到 m 次 | \d{3,5} 3-5 位數字 |
? (緊隨量詞後) | 非貪婪模式 (最短匹配) | .*? 匹配最少字元至下一模式 |
. | 任意單一字元 (除換行) | a.b 匹配 aXb, a3b... |
(pattern) | 捕獲群組 (可用 $1/$2 反向引用) | (\d{4})-(\d{2}) 擷取年月 |
(?:pattern) | 非捕獲群組 (僅分組不擷取) | (?:\d{3}-){2}\d{4} 電話格式 |
(?=pattern) | 正向前瞻 (零寬斷言) | Windows(?=95|98|NT) 匹配 Windows 後接版本 |
(?!pattern) | 負向前瞻 | Windows(?!95|98|NT) 排除特定版本 |
x|y | 或 (Alternation) | cat|dog 匹配 cat 或 dog |
[abc] | 字元集合 | [aeiou] 母音 |
[^abc] | 排除字元集合 | [^0-9] 非數字 |
\d \w \s | 數字/單字字元/空白字元 簡寫 | \d+ 一或多個數字 |
\D \W \S | 上述反向集合 | \D+ 非數字序列 |
| 驗證項目 | 正則模式 | 說明 |
|---|---|---|
^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$ | 支援子域名、多種頂級域 | |
| 手機號 (台灣) | ^09\d{8}$ | 09 開頭 10 位 |
| 身分證字號 (台灣) | ^[A-Z][12]\d{8}$ | 字母+性別碼+8碼數字 |
| 統一編號 (台灣) | ^\d{8}$ | 8 位數字 (可加檢查碼演算法) |
| URL | ^https?://([\w-]+\.)+[\w-]+(/.*)?$ | HTTP/HTTPS 基本檢查 |
| IPv4 | ^((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)$ | 嚴格 0-255 四段 |
| 中文姓名 | ^[\u4e00-\u9fa5]{2,10}$ | 2-10 個中文字元 |
| 強密碼 | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%]).{8,}$ | 大小寫/數字/特殊字元/8字元以上 |
| 日期 (YYYY-MM-DD) | ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ | 格式檢查 (不驗證月份天數邏輯) |
// 1. 編譯緩存:靜態唯讀 Regex 實例 (執行緒安全)
private static readonly Regex EmailRegex = new Regex(
@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$", RegexOptions.Compiled);
// 2. 驗證方法
public bool IsValidEmail(string email)
{
return EmailRegex.IsMatch(email);
}
// 3. ASP.NET RegularExpressionValidator 直接使用
// <asp:RegularExpressionValidator ValidationExpression="^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$" />
// 4. 替換應用
string sanitized = Regex.Replace(input, @"", "", RegexOptions.IgnoreCase | RegexOptions.Singleline);
RegexOptions.Compiled 將模式編譯為 IL,重複使用效能提升 30%+。(a+)+、模糊模式 .*,改用具體字元集合 [^>]*。
3. 單一職責:複雜驗證拆分為多個簡單 Regex,或改用程式碼邏輯 (如日期邏輯驗證)。
4. 文件化:每個 Regex 附註釋說明用途、測試案例、來源。
5. 工具輔助:使用 Regex101、Regexr 即時測試與解釋。
正則表達式是雙面刃:威力強大但易寫成「寫時讀不懂」的代碼。掌握核心語法、建立模式庫、遵循最佳實踐,才能發揮其最大價值。