1

早上好

我正在尝试获取一个必须具有一个或多个表格单元格(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

4 回答 4

1

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

但我完全同意 Jan 的上述评论。使用 html 解析器,它将更加健壮和可读。

于 2010-11-25T11:31:00.173 回答
1

这个正在工作

Regex.Matches(sourceHtmlString, @"(?<1><TR[^>]*>\s*<td.*?</tr>)", 
              RegexOptions.Singleline | RegexOptions.IgnoreCase)
于 2010-11-25T15:38:43.190 回答
0

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

如果您在服务器端环境(例如 PHP)上运行它,则可以使用正则表达式。

类似于:(]+>.?)

我建议的原因与其他任何事情相反 - 你想要获得整个内容,所以将整个内容包裹在括号中,TR 和 TD 可能有也可能没有宽度,确定这些事情永远不会有害。

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

但正如 robert 指出的那样,在服务器端,适当的 HTML 解析器会更好,DOM 或 XML 扩展都应该能够处理它。

于 2010-11-25T11:37:34.410 回答
-1

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

或者,更好的是,使用 HTML 解析器。HTML 不是正则语言,不能真正通过正则表达式进行解析。

于 2010-11-25T11:34:31.537 回答