2009-10-01 105 views
1

什么正则表达式可以匹配表格单元格中的可识别文本的嵌套表格?我试过了,但没有拿出一个正则表达式来提取特定的表,我希望在示例中抓取两个表的开始和结束。下面是一些上手:“<table>.*?</table>什么正则表达式可以匹配表格单元格中可识别文本的嵌套表格?

<table> 
    <tr> 
     <td> 
      <table> 
       <tr><td>Code1</td></tr> 
       <tr><td>some data</td></tr> 
       <tr><td>etc ...</td></tr> 
      </table> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <table> 
       <tr><td>Code2</td></tr> 
       <tr><td>some data</td></tr> 
       <tr><td>etc ...</td></tr> 
      </table> 
     </td> 
    </tr> 
</table> 

说我想提取含“代码2”的表格。什么正则表达式将专门匹配,只有那张表?

+6

请考虑使用HTML解析器/ DOM。一般来说,使用正则表达式解析HTML并不被认为是最佳实践。有解析器可用于PHP,.NET等(不知道你使用的是什么语言)。 – TrueWill 2009-10-01 17:24:12

+0

[可以提供一些为什么很难用正则表达式解析XML和HTML的例子吗?](http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-为什么它很难解析xml和html-with-a-rege) – 2011-07-09 21:00:23

+0

[RegEx match open tags not except XHTML self-contained tags](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – 2011-09-15 14:10:21

回答

4

下面的正则表达式会发现你的表:

(?ms)<table>((?!<table>).)*<td>Code2</td>.*?</table> 

随着(?ms)您开启“多场比赛” (m)和“点相匹配的新行,太” (s)。然后你有一个负面的预测(?!),以确保你的比赛中没有第二次表的开始。

1

请勿使用正则表达式。使用HTML解析器!

然而,在Perl(假设你没有嵌套表):

$xml =~ /<table>.*<td>Code2<\/td>.*<\/table>/s; 
+5

不要使用XML解析器,请使用** HTML **解析器! – 2009-10-01 17:25:52

+0

(除非当然你可以肯定的内容是有效的XHTML) – 2009-10-01 17:27:31

+0

谢谢,编辑了答案。 – tster 2009-10-01 17:28:15

5

我不会对这种使用正则表达式,因为HTML是不正规,没有边缘的结束案件让你起来。你最好使用HTML解析器。无论您使用哪种语言或平台,都会有一个可用的。