正則表達式是文字處理的瑞士刀,善用命名捕獲群組能讓程式碼更易讀、維護性更高。本文透過兩個實戰案例,示範如何在 C# 中撰寫高可讀性的 Regex 模式,精準萃取結構化資料。
string raw = "ErrorCode:-1,Message:{\"UserId\":\"1000\",\"userName\":\"ZhangSan\"}";
需同時取得 -1 與完整 JSON 物件 {"UserId":"1000","userName":"ZhangSan"}。
(?<key>...)using System.Text.RegularExpressions;
string pattern = @"ErrorCode:(?<key>.*?),Message:\{(?<key>.*?)\}";
// ↑ 群組名 key ↑ 同名群組 key (會合併捕獲)
Regex reg = new Regex(pattern);
Match match = reg.Match(raw);
if (match.Success)
{
// Groups["key"].Captures 會依序保存兩個捕獲值
var captures = match.Groups["key"].Captures;
string errorCode = captures[0].Value; // "-1"
string jsonBlock = captures[1].Value; // "UserId\":\"1000\",\"userName\":\"ZhangSan"
// 若需完整 JSON 格式,自行補上大括號
string fullJson = "{" + jsonBlock + "}";
Console.WriteLine($"{errorCode} -- {fullJson}");
// 輸出:-1 -- {"UserId":"1000","userName":"ZhangSan"}
}
| 語法 | 說明 |
|---|---|
(?<name>...) | 命名捕獲群組,可透過 Groups["name"] 存取 |
.*? | 非貪婪匹配:盡可能少吃字元,遇到後續 ,Message: 即停止 |
\{ / \} | 大括號為特殊字元,需跳脫 |
| 同名群組重複出現 | 所有捕獲值會疊加在 Groups["name"].Captures 集合中,依出現順序索引 |
<td align="center"><ul>
<li>查詢結果1:北京市 網通</li>
<li>查詢結果2:北京市 網通</li>
<li>查詢結果3:北京市 網通</li>
</ul></td>
目標:只取「查詢結果1」後的城市資訊 北京市 網通。
string html = @"<td align=""center""><ul><li>查詢結果1:北京市 網通</li><li>查詢結果2:北京市 網通</li><li>查詢結果3:北京市 網通</li></ul></td>";
string pattern = @"<li>查詢結果1:(?<key>.*?)</li>";
// ↑ 非貪婪匹配,遇到第一個 </li> 即停止
Match mc = Regex.Match(html, pattern);
if (mc.Success)
{
string city = mc.Groups["key"].Value; // "北京市 網通"
Console.WriteLine(city);
}
var regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
// IgnoreCase: 大小寫不敏感
// Singleline: 讓 . 能匹配換行符,跨行擷取時必備
// Multiline: 讓 ^ $ 匹配每行開頭結尾
// Compiled: 編譯成 IL,首次較慢但重複使用極快 (靜態 Regex 推薦)
// ExplicitCapture: 僅捕獲命名群組,忽略未命名括號,提升效能
private static readonly Regex _regex = new Regex(pattern, RegexOptions.Compiled);(a+)+,改用非貪婪或原子群組 (?>...)[GeneratedRegex] 原始碼產生器,編譯期即完成編譯(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) // 日期解析
(?<ip>(?:\d{1,3}\.){3}\d{1,3}) // IPv4
(?<email>[\w.+-]+@[\w-]+\.[\w.-]+) // Email 簡易版
(?<id>[A-Z]\d{9}) // 台灣身分證字號
掌握命名群組 + 非貪婪匹配 + 適當旗標三大要訣,即能撰寫出既精準又好維護的正則表達式,大幅降低字串解析的 Bug 率與維護成本。