2013-02-16 34 views
0

一直在嘗試幾個小時來解決此問題。我想用正則表達式來選擇整個的div包括嵌套的div看到例如下面的字符串:正則表達式選擇整個外部DIV

AA <div> Text1 </div> BB <div style=\"vertical-align : middle;\"> Text2 <div>Text 3</div> </div> CC 

想用下面的代碼返回下列值

<div> Text1 </div> 
<div style=\"vertical-align : middle;\"> Text2 <div>Text 3</div> </div> 

的關閉我有,但只是給我每個DIV

(?<BeginTag><\s*div.*?>)|(?<EndTag><\s*/\s*div.*?>) 

任何幫助將是偉大的。

+3

好,http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – driis 2013-02-16 15:55:46

+1

'我想用正則表達式來選擇整個div,包括嵌套div' - 不相信我,你不想使用正則表達式來完成這個任務。否則,你已經浪費的時間試圖做這項工作,很快就會變成幾周,幾個月和幾年,結果相同。一位智者曾經說過:「有些人在遇到問題時想'我知道,我會用正則表達式'。現在他們有兩個問題。「那麼你是否嘗試過使用HTML解析器,如[HTML敏捷包](http://htmlagilitypack.codeplex.com/)? – 2013-02-16 15:59:13

+0

哈哈:)歡呼達林 – Chris 2013-02-16 16:03:16

回答

1

To expand on my rather snarky comment,正則表達式不是解析任何類型的HTML的好工具。只有在最簡單的情況下才可行,即使如此,我也不會推薦它。

你需要的是解析HTML的好工具。在.NET世界中,一個很好的庫是HTMLAgilityPack或者SGMLReader project

你確實需要投入一點時間來學習API,但它是值得的。

對於您展示的小片段,我認爲最簡單的API將是SGMLReader。它可以像讀取HTML一樣讀取HTML,這意味着您可以將其轉換爲XDocument並使用更好的API。該代碼看起來是這樣的:

string markup = "<html>AA <div> Text1 </div> BB <div style=\"vertical-align : middle;\"> Text2 <div>Text 3</div> </div> CC</html>"; 
XDocument doc; 
using(var reader = Sgml.SgmlReader.Create(new StringReader(markup))) 
    doc = XDocument.Load(reader); 

var rootLevelDivs = doc.Root.Elements("div"); 
foreach(var div in rootLevelDivs) 
    Console.WriteLine(div); 
+1

最重要的是,正則表達式無法解析無限高度的遞歸結構。 – usr 2013-02-16 16:38:57