【问题标题】:Regex for extracting only TR with TDs用于仅提取带有 TD 的 TR 的正则表达式
【发布时间】:2010-11-25 11:28:06
【问题描述】:

早安

我正在尝试获取必须具有一个或多个表格单元格 (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 的最佳模式是什么?

【问题讨论】:

标签: c# html regex text-extraction


【解决方案1】:

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

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

【讨论】:

  • 那行不通? Regex.Matches("&lt;table&gt;&lt;TR valign=\"top\"&gt;&lt;TD width=\"15%\"&gt;Michael Jackson&lt;/TD&gt;&lt;TD width=\"5%\"&gt;Cramberries&lt;/TD&gt;&lt;TD width=\"25%\"&gt;Pixies&lt;/TD&gt;&lt;TD width=\"45%\"&gt;The Ramones&lt;/TD&gt;&lt;/TR&gt;&lt;/table&gt;", @"&lt;tr(\s[^&gt;*)?&gt;.*?&lt;td(\s[^&gt;]*)?&gt;.*?&lt;/tr(\s[^&gt;]*)?&gt;", RegexOptions.Multiline | RegexOptions.IgnoreCase)
【解决方案2】:

这个正在工作

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

【讨论】:

    【解决方案3】:

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

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

    类似:(]+>.?)

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 常规语言不适用于现代正则表达式,也不适用于(.)\1
      • 是的,“现代”正则表达式可以匹配的不仅仅是正则语言,但它们仍然无法处理非平凡的 HTML。
      猜你喜欢
      • 2014-01-12
      • 2012-07-25
      • 2015-04-12
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多