2015-08-19 20 views
0

preceeded我有這個下面的HTML文件的結構:找到一個正規表達式模式沒有什麼

<table> 
    <tr class="heading"> 
     <td colspan="2"> 
     <h2 class="groupheader">Public Types</h2> 
     <!-- I don't want that! We're in a table.--> 
     </td> 
    </tr> 
    <tr>...</tr> 
</table> 
<h2 class="groupheader">Detailed Description</h2> 
    <!-- I want all that until the next h2--> 
    <div class="textblock"><p>Provides the functions to control the generation of a single data log file. </p> 
    <h4>Example</h4> 
    <div class="fragment"><div class="line">Test <a href="aaa">stuff</a>();</div> 
     <div class="line">...</div>  
     <div class="line">...</div> 
    </div> 
</div> <!-- end of first result --> 

<h2 class="groupheader">Member</h2> 
<!-- I want all that until the next h2 or hr--> 
<a class="anchor"></a> 
<div class="memitem"> 
<div class="memproto"> 
     <table class="memname"> 
     <tr> 
      <td class="memname">enum <a class="el" href="...">test</a></td> 
     </tr> 
     </table> 
</div><div class="memdoc"> 
<hr><!-- End of 2nd result --> 

並用正則表達式,我需要得到所有各標題之間的內容,直到下一個標題或小時標記,預計它是否在表中。

到目前爲止,我已經獲得了我所有的h2-> h2 | hr內容。它是這樣:

(?s)(<h2 class="groupheader">.*?)(<h2|<hr) 

我怎麼能跳過包含在表中的H2下的內容?我已經嘗試用負面看背後,但我沒有得到任何地方。

謝謝你的幫助。

+1

似乎你有一些錯別字讓我無法理解這個問題,你能解決它嗎?也許提供一些樣本數據和樣本輸出? –

+0

你需要準確地得到,不明白,請添加一個例子,以及它如何失敗 –

+0

我試圖澄清我的問題。希望它更好! – Flag

回答

1

需要注意的是HTML應與適當的解析器解析現在

,因爲我們只剩下HTML的前瞻性投入,任務

讓所有各標題之間的內容直到下一個標題或hr標記,期待它是否在表中

讓我說明如何做到這一點。

你可以得到你需要一個tempered greedy token((?:(?!<\/table|<h2|<hr)(?:<table\b[^<]*>.*?<\/table>|.))*)的幫助下,子(即匹配之前不啓動其中的任何否定的先行替代品的任何符號 - 因此,保持<table>範圍內的比賽 - 也匹配內表)在末端具有積極的向前看:

(?s)<h2 class="groupheader">[^<]*<\/h2>\s*((?:(?!<\/table|<h2|<hr)(?:<table\b[^<]*>.*?<\/table>|.))*)(?=<h2|<hr) 

請參閱demo

請注意,代替h2,您可以使用h\d+來支持任何級別的h

+0

感謝您的輸入,即照顧表中的h2部分,但我失去了一個h2那不是在一張桌子裏。我已更新我的示例以添加一個案例。這很粗糙... – Flag

+0

請檢查我的更新。這是醜陋的,但它應該工作,如果表標籤沒有放錯位置。 –

相關問題