首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 正則運算式三大比對模式深度解析:Singleline、Multiline、IgnoreCase 實戰範例

     編輯:關於C語言

C# Regex` 類別支援三種核心比對模式,透過 RegexOptions` 列舉或內嵌修飾符啟用。理解它們如何改變元字元行為,是編寫高效、正確正則的關鍵。本文透過實戰場景詳細解析 Singleline(單行)、Multiline(多行)、IgnoreCase(忽略大小寫) 三種模式。

模式速查表

模式RegexOptions內嵌修飾符影響元字元核心行為變化
SinglelineRegexOptions.Singleline(?s) / (?-s). (點號)點號匹配任意字元包含換行,而非「非換行字元」
MultilineRegexOptions.Multiline(?m) / (?-m)^、$^/$ 匹配每行開頭/結尾,而非整個字串開頭/結尾
IgnoreCaseRegexOptions.IgnoreCase(?i) / (?-i)所有字母英文字母不區分大小寫比對

1. Singleline(單行模式)— 讓點號吃掉換行

場景:解析跨多行的 HTML 區塊


var html = @"
Line 1 Line 2
";

錯誤示範(預設模式)


var pattern = @"
.*
"; var regex = new Regex(pattern); // 無 Singleline Console.WriteLine(regex.IsMatch(html) ? "匹配" : "不匹配"); // 輸出:不匹配

原因: 預設下 . 不匹配 \n(Windows 為 \r\n),.* 在第一行結尾停止,無法跨行匹配到

。

正確做法:啟用 Singleline


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 即可。

2. Multiline(多行模式)— 讓 ^ $ 逐行生效

場景:從多行文字檔找出以英文字母開頭的使用者名稱


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 : "不匹配"); // 不匹配

原因: ^ 僅匹配整個字串開頭,首字為中文,失敗。

正確做法:啟用 Multiline


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";

3. IgnoreCase(忽略大小寫)— 大小寫一視同仁

場景:同樣找英文開頭行,但模式只寫小寫


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.IgnoreCase
  • 內嵌修飾符優先級 高於 RegexOptions 建構子參數:(?s) 強制開啟 Singleline,即使建構子未傳 RegexOptions.Singleline 也生效;(?-s) 強制關閉。
  • 區域限制:(?s:...) 僅在群組內啟用 Singleline,群組外不影響。

實戰最佳實務

  1. 解析 HTML/JSON 等結構化文本: 必開 Singleline,配合非貪婪量詞 .*? 避免過度匹配。
  2. 逐行處理日誌/清單: 開 Multiline,使用 ^/$ 定位行邊界。
  3. 關鍵字搜尋/驗證: 開 IgnoreCase 簡化模式(無需 [A-Za-z])。
  4. 效能考量: IgnoreCase 略增加比對開銷;大量資料可預先 ToLower() 再用區分大小寫模式。
  5. 除錯技巧: 使用 Regex.Split、Regex.Matches 配合 Match.Groups 逐步驗證模式行為。

常見陷阱提醒

誤區正確認知
Singleline 讓 ^ $ 變多行Singleline 只影響點號;^/$ 由 Multiline 控制
Multiline 讓點號匹配換行Multiline 只影響 ^/$;點號由 Singleline 控制
內嵌修飾符寫在模式末尾修飾符必須在生效範圍之前,如 (?s)pattern,而非 pattern(?s)
以為 \A/\Z 受 Multiline 影響\A/\Z 永遠對應整個字串開頭/結尾,不受任何模式影響

熟練掌握三大模式的獨立作用與組合效果,能讓你編寫出更精準、高效、可維護的正則運算式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved