用正则表达式清理html代码

时间:2013-05-01 01:41:03

标签: regex html-parsing

我正在解析一些事务,例如3个事务看起来像这样:

<TR class=DefGVRow>
<TD>29/04/2013</TD>
<TD><A href="javascript:__doPostBack('ctl00$cp$GVMov','Deposito$29/04/2013|0140959158|+|0,00')">DEPOSITO 0140959158</A></TD>
<TD>0140959158</TD>
<TD align=right>336,00</TD>
<TD align=center>+</TD>
<TD align=right>16.210,60</TD></TR>H
<TR class=DefGVAltRow>
<TD>29/04/2013</TD>
<TD>RETIRO ATM CTA/CTE</TD>
<TD>1171029739</TD>
<TD align=right>600,00</TD>
<TD align=center>-</TD>
<TD align=right>15.610,60</TD></TR>
<TR class=DefGVRow>
<TD>29/04/2013</TD>
<TD>C.SERV.CAJERO AUT.</TD>
<TD>1171029739</TD>
<TD align=right>3,25</TD>
<TD align=center>-</TD>
<TD align=right>15.607,35</TD></TR>

我现在的正则表达式是:

<TR class=\w+>
<TD>(?<day>\d{1,2})/(?<month>\d{1,2})/(?<year>\d{4})</TD>
<TD>(?<description>.+?)</TD>
<TD>(?<id>\d{3,30})</TD>
<TD.+?>(?<amount>[\d\.]{1,20},\d{1,10})</TD>
<TD.+?>(?<info>.+?)</TD>
<TD.+?>(?<balance>[\d\.]{1,20},\d{1,10})</TD></TR>

如何编辑

<TD>(?<description>.+?)</TD>

要处理与同一提取的其他部分匹配的可选标记吗? (基本上:捕获组时如何忽略A标记)

谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个非常普遍的问题。请检查此epic answer并停止使用正则表达式“解析”html,而是使用正确的解析器并使用XPath甚至CSS选择器获得所需的内容。

答案 1 :(得分:2)

这将删除“可选”链接:

<TR class=\w+>
<TD>(?<day>\d{1,2})/(?<month>\d{1,2})/(?<year>\d{4})</TD>
<TD>(?:<A href=".*>)?(?<description>.+?)(?:</A>)?</TD>
<TD>(?<id>\d{3,30})</TD>
<TD.+?>(?<amount>[\d\.]{1,20},\d{1,10})</TD>
<TD.+?>(?<info>.+?)</TD>
<TD.+?>(?<balance>[\d\.]{1,20},\d{1,10})</TD></TR>