2008-12-09 92 views
1

我需要使用正則表達式來匹配一個字符串holiding html來取出所有嵌套跨度,我假設我有一種方法可以使用正則表達式來完成,但是沒有整個上午都很成功使用Lookahead匹配使用正則表達式的字符串

所以對於

<DIV id=c445c9c2-a02e-4cec-b254-c134adfa4192 style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid; BACKGROUND-COLOR: #eeeeee"> 
<SPAN id=b8db8cd1-f600-448f-be26-2aa56ea09a9c> 
<SPAN id=304ccd38-8161-4def-a557-1a048c963df4> 
<IMG src="http://avis.co.uk/Assets/build/menu.gif"> 
</SPAN> 
</SPAN> 
<SPAN id=bc88c866-5370-4c72-990b-06fbe22038d5> 
<SPAN id=55b88bbe-15ca-49c9-ad96-cecc6ca7004e>UK<BR></SPAN> 
</SPAN> 
<SPAN id=52bb62ca-8f0a-42f1-a13b-9b263225ff1d> 
<SPAN id=0e1c3eb6-046d-4f07-96c1-d1ac099d5f1c> 
<IMG src="http://avis.co.uk/Assets/build/menu.gif"> 
</SPAN> 
</SPAN> 
<SPAN id=4c29eef2-cd77-4d33-9828-e442685a25cb> 
<SPAN id=0d5a266a-14ae-4a89-9263-9e0ab57f7ad2>Italy</SPAN> 
</SPAN> 
<SPAN id=f0a72eea-fddd-471e-89e6-56e9b9efbece> 
<SPAN id=b7d9ada7-ade0-49fe-aa5f-270237e87c2b> 
<IMG src="http://avis.co.uk/Assets/build/menu.gif"> 
</SPAN> 
</SPAN> 
<SPAN id=7604df94-34ba-4c89-bf11-125df01731ff> 
<SPAN id=330d6429-4f1b-46a2-a485-9001e2c6b8c1>Netherlands</SPAN> 
</SPAN> 
<SPAN id=a18fb516-451e-4c32-ab31-3e3be29235f6> 
<SPAN id=6c70238d-78f9-468f-bb8d-370fff13c909> 
<IMG src="http://avis.co.uk/Assets/build/menu.gif"> 
</SPAN> 
</SPAN> 
<SPAN id=5a2465eb-b337-4f94-a4f8-6f5001dfbd75> 
<SPAN id=47877a9e-a7d5-4f13-a41e-6948f899e385>Malta &amp; Gozo 

樣本輸入字符串我希望得到每個外跨度和它所包含的跨度,以便在上面的文字應該有八個結果

任何幫助欣然接受

回答

1

試試這個:

@"(?is)<SPAN\b[^>]*>\s*(<SPAN\b[^>]*>.*?</SPAN>)\s*</SPAN>" 

這是基本相同PhiLho的正則表達式,但它允許標籤之間的空白在兩端。我還必須添加SingleLine/DOTALL修改器以適應匹配文本中的行分隔符。我不知道這些變化是否真的有必要; OP張貼的樣本數據全部在一行上,但PhiLho將其分解(從而破壞了他自己的正則表達式)。

5

再次use an HTML parser走DOM:正則表達式永遠不會足夠強大,以執行此操作。

+0

regexHtmlParserQuestions ++ ;-) – Tomalak 2008-12-09 11:08:38

+0

我認爲這是一個好名字的標記;-) – 2008-12-09 12:06:56

4

使用標準正則表達式來解決這個問題實際上是不可能的,因爲它們基本上實現了Chomsky hierarchy(有限狀態自動機)中的3型語法,而至少需要2型語法(某種堆棧或遞歸)來正確地識別任意的嵌套結構。

但是,如果您限制最大可能的嵌套級別,那麼它可能是可能的,但我仍然懷疑正則表達式是否是最佳解決方案。

0

基本上,我同意上面的建議,使用正則表達式來解析HTML是要求代碼打破有一天奇怪的合法HTML結構(更不用說格式錯誤的HTML,瀏覽器接受...)。尋找和使用一個好的HTML解析器可以在很多方面有所收穫...

現在,我很務實(我無法抗拒一個小的正則表達式的挑戰...),有時候我使用機器生成的HTML(通常是導出功能),因爲我知道我看到的結構不太可能發生變化,這與作者可以進行拼寫錯誤的手工生成的頁面不同;它主要是爲了在輸出發生變化時可以適應的快速黑客。

就你而言,HTML是相當規則的,線性的和可預測的,所以RE很簡單。我給Java代碼,因爲我不知道C#,但適應應該是微不足道的。

Pattern p = Pattern.compile("(<SPAN id.*?<SPAN id.*?</SPAN></SPAN>)"); 
Matcher m = p.matcher(html); 
while (m.find()) 
{ 
    System.out.println(m.group(1)); 
} 

HTH。