C# Regex` 類別支援三種核心比對模式,透過 RegexOptions` 列舉或內嵌修飾符啟用。理解它們如何改變元字元行為,是編寫高效、正確正則的關鍵。本文透過實戰場景詳細解析 Singleline(單行)、Multiline(多行)、IgnoreCase(忽略大小寫) 三種模式。
| 模式 | RegexOptions | 內嵌修飾符 | 影響元字元 | 核心行為變化 |
|---|---|---|---|---|
| Singleline | RegexOptions.Singleline | (?s) / (?-s) | . (點號) | 點號匹配任意字元包含換行,而非「非換行字元」 |
| Multiline | RegexOptions.Multiline | (?m) / (?-m) | ^、$ | ^/$ 匹配每行開頭/結尾,而非整個字串開頭/結尾 |
| IgnoreCase | RegexOptions.IgnoreCase | (?i) / (?-i) | 所有字母 | 英文字母不區分大小寫比對 |
var html = @"
Line 1
Line 2
";
var pattern = @".*";
var regex = new Regex(pattern); // 無 Singleline
Console.WriteLine(regex.IsMatch(html) ? "匹配" : "不匹配"); // 輸出:不匹配
原因: 預設下 . 不匹配 \n(Windows 為 \r\n),.* 在第一行結尾停止,無法跨行匹配到
var regex = new Regex(pattern, RegexOptions.Singleline);
// 或 內嵌修飾符:var pattern = @"(?s).*";
Console.WriteLine(regex.Match(html).Value);
// 輸出:
//
// Line 1
// Line 2
//
\A、\Z 不受 Singleline 影響\A 永遠匹配字串開頭,\Z 永遠匹配字串結尾(或結尾前的 \n)。^/$ 針對整字串行為,單獨啟用 Singleline 即可。
var text = @"二十四畫生
TerryLee
莫相會
Dflying Chen
Rainy";
var pattern = @"^[A-Za-z]+.*";
var regex = new Regex(pattern);
Console.WriteLine(regex.IsMatch(text) ? regex.Match(text).Value : "不匹配"); // 不匹配
原因: ^ 僅匹配整個字串開頭,首字為中文,失敗。
var regex = new Regex(pattern, RegexOptions.Multiline);
// 或 內嵌:var pattern = @"(?m)^[A-Za-z]+.*";
Console.WriteLine(regex.Match(text).Value); // 輸出:TerryLee
此時 ^ 匹配每行開頭,$ 匹配每行結尾,成功找到第二行。
\A/\Z 鎖定整體邊界
// 只匹配整個字串開頭的英文行(非多行模式下 ^ 行為相同)
var pattern2 = @"\A[A-Za-z]+.*";
// 只匹配整個字串結尾的行
var pattern3 = @".*[A-Za-z]+\Z";
var pattern = @"^[a-z]+.*"; // 僅小寫
var regex = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase);
// 或 內嵌:var pattern = @"(?mi)^[a-z]+.*";
Console.WriteLine(regex.Match(text).Value); // 輸出:TerryLee(大寫 T 也匹配)
RegexOptions.Singleline | RegexOptions.Multiline | RegexOptions.IgnoreCaseRegexOptions 建構子參數:(?s) 強制開啟 Singleline,即使建構子未傳 RegexOptions.Singleline 也生效;(?-s) 強制關閉。(?s:...) 僅在群組內啟用 Singleline,群組外不影響。Singleline,配合非貪婪量詞 .*? 避免過度匹配。Multiline,使用 ^/$ 定位行邊界。IgnoreCase 簡化模式(無需 [A-Za-z])。IgnoreCase 略增加比對開銷;大量資料可預先 ToLower() 再用區分大小寫模式。Regex.Split、Regex.Matches 配合 Match.Groups 逐步驗證模式行為。| 誤區 | 正確認知 |
|---|---|
| Singleline 讓 ^ $ 變多行 | Singleline 只影響點號;^/$ 由 Multiline 控制 |
| Multiline 讓點號匹配換行 | Multiline 只影響 ^/$;點號由 Singleline 控制 |
| 內嵌修飾符寫在模式末尾 | 修飾符必須在生效範圍之前,如 (?s)pattern,而非 pattern(?s) |
| 以為 \A/\Z 受 Multiline 影響 | \A/\Z 永遠對應整個字串開頭/結尾,不受任何模式影響 |
熟練掌握三大模式的獨立作用與組合效果,能讓你編寫出更精準、高效、可維護的正則運算式。