首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 正則表達式提取 <h3> 標簽內容:命名捕獲組與非貪婪匹配實戰

     編輯:程式設計綜合問答

問題描述

給定 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(); }

工具推薦

  • HtmlAgilityPack:NuGet 安裝,專業 HTML 解析器,XPath/CSS 選擇器,容錯率極高,強烈建議替代正則解析 HTML;
  • AngleSharp:現代、標準兼容、支持 CSS 選擇器、LINQ 查詢;
  • 在線正則測試:regex101.com (解釋、調試、生成代碼)。

總結

正則提取標簽內容:命名捕獲組 (?.*?) + 非貪婪 .*? + Singleline。但**解析 HTML 首選 HtmlAgilityPack/AngleSharp**,正則僅適用於極簡、結構固定、無巢狀片段。生產代碼請用專業解析器,避免「用正則解析 HTML」成為維護噩夢。

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