我需要在每行的最后</td>
和结束</tr>
之间获取所有代码。我使用的正则表达式<\/TD\s*>(.*?)<\/TR\s*>
从第一个</TD>
到最后</TR>
检索所有正则表达式 - 在下面的示例中标有粗体。
<TABLE>
<TR><TD>TD11**</TD><TD>TD12</TD><TD>TD13</TD><SPAN><FONT>test1</FONT></SPAN></TR>**
<TR><TD>TD21**</TD><TD>TD22</TD><TD>TD23</TD><SPAN><FONT>test2</FONT></SPAN></TR>**
</TABLE>
但我真正需要的是
<TABLE>
<TR><TD>TD11</TD><TD>TD12</TD><TD>TD13**</TD><SPAN><FONT>test1</FONT></SPAN></TR>**
<TR><TD>TD21</TD><TD>TD22</TD><TD>TD23**</TD><SPAN><FONT>test2</FONT></SPAN></TR>**
</TABLE>
答案 0 :(得分:2)
不建议使用正则表达式来解析HTML,html是非常规的,并且在尝试使用正则表达式时非常不可靠。
这是一篇很好的博客文章,解释了逻辑和提供替代方案: http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html
答案 1 :(得分:1)
</TD>((?:(?!</T[DR]>).)*)</TR>
正则表达式启动以匹配第一个</TD>
,但是一旦到达第二个</TD>
就会失败,因为(?!</T[DR]>).
匹配任何</TD>
不是</TR>
或(?:...)*
标记的第一个字符的字符。由于封闭</TR>
,这是可选的,因此它会尝试匹配正则表达式的下一部分,即</TD>
。这也失败了,所以放弃了比赛尝试。
它再次尝试从第二个</TD>
开始并再次失败。最后,它会在第三个 </TR>
处开始匹配,并从那里成功匹配到第一个{{1}}。
如果您的示例中没有显示换行符,您可能需要指定“单行”或“点匹配全部”模式。你没有指定正则表达式的味道,所以我不能确切地说如何做到这一点。