給定 Regex reg = new Regex("<h3>.*</h3>"),如何直接獲取標簽內的文本內容(即星號部分),而不是包含標簽的整個匹配。
var html = @"標題一
內容
標題二
";
// 1. 正則模式:命名捕獲組 (?...) + 非貪婪 .*?
var pattern = @"(?.*?)
";
var regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
// 2. 匹配並提取
foreach (Match match in regex.Matches(html)) {
if (match.Success) {
string content = match.Groups["content"].Value; // 直接獲取捕獲組值
Console.WriteLine(content); // 輸出: 標題一 / 標題二
}
}
| 元素 | 作用 |
|---|---|
(? |
命名捕獲組,match.Groups["name"] 直接取值,語義清晰 |
.*? |
非貪婪匹配:儘可能少匹配字符,停在第一個 </h3>,避免跨標簽吞噬 |
RegexOptions.Singleline |
讓 . 匹配換行符,跨行標簽內容也能提取 |
RegexOptions.IgnoreCase |
忽略大小寫,兼容 <H3> |
match.Groups[0].Value |
整個匹配 (含標簽),Groups["content"] 為捕獲組內容 |
// 1. 標簽帶屬性:內容
var pattern = @"]*>(?.*?)
";
// 2. 巢狀標簽 (正則無法完美處理,建議用 HtmlAgilityPack)
var doc = new HtmlDocument();
doc.LoadHtml(html);
foreach (var node in doc.DocumentNode.SelectNodes("//h3")) {
Console.WriteLine(node.InnerText); // 自動處理巢狀、實體解碼
}
// 3. 大文件流式處理:Regex.Match + while 避免一次性載入所有匹配
Match m = regex.Match(html);
while (m.Success) {
Console.WriteLine(m.Groups["content"].Value);
m = m.NextMatch();
}
正則提取標簽內容:命名捕獲組 (? + 非貪婪 .*? + Singleline。但**解析 HTML 首選 HtmlAgilityPack/AngleSharp**,正則僅適用於極簡、結構固定、無巢狀片段。生產代碼請用專業解析器,避免「用正則解析 HTML」成為維護噩夢。