正则表达式仅用TD提取TR

时间:2010-11-25 11:28:06

标签: c# html regex text-extraction

早上好

我正在尝试获得一个必须有一个或多个表格单元格(TD)的表格行(TR):

有这个字符串

<TABLE>
<TR valign="top">
  <TH>First</TH>
  <TH>2nd</TH>
  <TH>3rd</TH>
  <TH>4th</TH>
</TR>
<TR valign="top">
  <TD width="15%">Michael Jackson</TD>
  <TD width="5%">Cramberries</TD>
  <TD width="25%">Pixies</TD>
  <TD width="45%">The Ramones</TD>
</TR>
</TABLE>

我想得到:

<TR valign="top">
  <TD width="15%">Michael Jackson</TD>
  <TD width="5%">Cramberries</TD>
  <TD width="25%">Pixies</TD>
  <TD width="45%">The Ramones</TD>
</TR>

用嵌套的TD提取一个或多个TR的最佳模式是什么?

4 个答案:

答案 0 :(得分:1)

<tr(\s[^>*)?>.*?<td(\s[^>]*)?>.*?</tr(\s[^>]*)?>应该有效,但设置不区分大小写和多行标记。

但我完全赞同Jan上面的评论。使用html解析器,它将更加强大和可读。

答案 1 :(得分:1)

这个正在运作

Regex.Matches(sourceHtmlString, @"(?<1><TR[^>]*>\s*<td.*?</tr>)", 
              RegexOptions.Singleline | RegexOptions.IgnoreCase)

答案 2 :(得分:0)

这到底在哪里?如果你在浏览器中运行它,在Javascript中,有比正则表达更好的方法(例如tr上的jQuery选择器:has(td)作为随机例子)

如果您在服务器端环境中运行它,例如PHP,正则表达式可以工作。

类似于:(] +&gt;。?)

原因我建议与其他任何东西相反 - 你想获得整个内容,所以将整个内容包装在括号中,TR和TD可能有也可能没有宽度,从来没有伤害到确定这些东西

。*?在大多数regexp引擎中构造应该是非贪婪的,所以匹配符合的最小字符串 - 这应该防止......匹配。仍然需要多线和不区分大小写,通常是m和i,也需要设置。 (但我没有测试过这个)

但正如罗伯特指出的那样,在服务器端,一个合适的HTML解析器会更好,DOM或XML扩展应该能够处理它。

答案 3 :(得分:-1)

这不是正则表达式会做的事情。例如,尝试将文字与<tr[^>]*>.*?<td[^>]*>.*?</tr>匹配将匹配<th>行和第一个<td>行。您应首先匹配行,然后尝试搜索<td>的每一行。

或者,更好的是,使用HTML解析器。 HTML不是regular language,并且不能用正则表达式真正解析。