【问题标题】:C# regex html table inside a tableC# 正则表达式 html 表格内的表格
【发布时间】:2011-06-08 06:07:32
【问题描述】:

我正在使用以下正则表达式:

(<(table|h[1-6])[^>]*>(?<op>.+?)<\/(table|h[1-6])>)

从 html 文档中提取表格(和标题)。

我发现它在我们正在使用的文档中运行良好(使用 word 转换的文档保存为过滤后的 html),但是我有一个问题,如果表中包含一个表,则正则表达式将匹配初始表开始标签和第二个表格结束标签而不是初始表格结束标签。

在正则表达式中是否有办法指定如果它在匹配中找到另一个表标签以继续忽略下一个匹配并继续下一个匹配,依此类推?

【问题讨论】:

  • 请考虑 使用正则表达式,而是设计用于正确与 HTML tag-soup 一起工作的工具。
  • 在这个阶段并不是一个真正的选择,我们可以在某种程度上依赖 html,因为它会生成它,所以它应该是相当一致的

标签: c# html regex html-table


【解决方案1】:

不要这样做。

HTML 不是常规语法,因此正则表达式不是解析它的好工具。您在最后一句话中要求的是上下文解析器,而不是正则表达式。裸正则表达式解析很可能无法正确解析 HTML 来负责编码。

HtmlAgilityPack 是我过去使用的一个 MsPL 许可解决方案,它具有广泛接受的许可条款,并提供了一个格式良好的 DOM,可以使用 XPath 进行探测或以其他有用的方式进行操作(“提取所有文本,删除标签”是一种流行的用于导入 HTML 邮件进行搜索的标签,例如,在让 DOM 解析器翻阅 HTML 并只编码为您的特定业务案例增加价值的部分之后,这几乎是微不足道的)。

【讨论】:

【解决方案2】:

在正则表达式中有没有办法指定 如果它找到另一个表标签 在比赛中保持忽略 下一场比赛,继续下一场比赛 等等?

由于没有人真正回答这部分,我会——不。

这是使常规语言“常规”的部分原因。 regular language 是一种可以被某种正则语法识别的语法,通常用看起来很像基本正则表达式的语法来描述(10* 匹配 1 后跟任意数量的 0s),或者DFA。正如它们的名字所暗示的那样,“正则表达式”强烈地基于这些正则语言,但添加了一些函数,例如lookaheads and lookbehinds。作为一般规则,常规语言对它周围的事物或看到的事物一无所知,只知道它当前正在查看的内容以及它所处的有限状态。

TLDNR:为什么这对您很重要?由于常规语言无法以这种方式“计算”元素,因此无法记录您所看到的 &lt;table&gt;&lt;/table&gt; 元素的数量。 HTML 解析器就是这样做的——因为它不尝试模拟常规语言,所以它可以计算它看到的开始和结束标记的数量。

这是为什么最好不要使用正则表达式来解析 HTML 的主要示例;即使您知道它是如何形成的,您也无法解析它,因为可能存在嵌套元素。如果你能保证不会有嵌套表,那么这样做可能是可行的,但即便如此,使用解析器也会简单得多。


恳求理论计算机科学家:我已尽力以这里大多数人应该能够理解的方式解释我从 CS 理论课程中学到的知识。我知道常规语言可以“计算”有限数量的事物。请随时纠正我,但请善待!

【讨论】:

    【解决方案3】:

    正则表达式并不真正适合这种情况,因为您尝试执行的操作包含有关这是一种嵌套语言这一事实​​的知识。如果没有这些知识,就很难(也很难阅读和维护)提取这些信息。

    也许用 XPath 导航器做点什么?

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 2022-11-01
      • 2020-03-14
      • 1970-01-01
      • 2016-09-08
      • 2022-11-21
      • 2015-05-09
      • 1970-01-01
      • 2010-12-05
      相关资源
      最近更新 更多