【问题标题】:hierarchical regex expression分层正则表达式
【发布时间】:2011-01-15 12:41:33
【问题描述】:

构建一个匹配分层数据的单个正则表达式是否可能/实用?

例如:

<h1>Action</h1>
  <h2>Title1</h2><div>data1</div>
  <h2>Title2</h2><div>data2</div>
<h1>Adventure</h1>
  <h2>Title3</h2><div>data3</div>

我想以匹配结束。

"Action", "Title1", "data1"
"Action", "Title2", "data2"
"Adventure", "Title3", "data3"

正如我所见,这需要知道这里有一个层次结构,如果我对模式进行编码以捕获 H1,它只匹配该层次结构的第一个条目。如果我不为 H1 编码,那么我无法捕获它。想知道我是否有什么特殊的技巧可以解决这个问题。

这是一个 .NET 项目。

【问题讨论】:

  • 用什么语言?正则表达式不是一种语言。它有许多不同的方言,其中一些支持您想要的,而另一些则不支持。大多数人没有。
  • 那不是使用正则表达式的好地方,而是HTML解析器;根据您的平台,我们可以推荐一个好的平台。请编辑您的问题并重新标记。
  • 从经验来看,正则表达式可以非常有效地处理野外的 HTML:D 认为它并不优雅——但它在所花的时间里是有效的。
  • @Mark Byers:正则表达式一种语言。
  • 我使用了一个 HTML 示例进行说明,但我的数据不一定是 HTML。它可以是一段纯文本,第一行始终是标题。我也在 .NET 平台上工作。

标签: regex hierarchy hierarchical


【解决方案1】:

通常认为尝试使用 RegEx 解析 HTML/XML 是不好的做法,因为它是分层的。您可以使用递归函数来执行此操作,但在这种情况下,更好的解决方案是使用真正的 XML 解析器。在不知道您使用的平台的情况下,我无法给您更好的建议。

编辑:正则表达式也很慢,这是处理 HTML 不好的另一个原因;但是,我不知道 XML/DOM 处理器可能会更快,因为它可能会使用更多的内存。

如果您只是想从一个简单文档中获取数据,就像您演示的那样,和/或如果您想自己构建一个解决方案,那么做起来并不难。只需构建一个简单的、基于递归状态的流处理器,它会查找标签并将内容传递到下一个递归级别。

例如:

- In a recursive function, seek out a "<" character.
- Now find a ">" character.
- Preserve everything you find until the next "<" character.
- Find a ">" character.
- Pass whatever you found between those tags into the recursive function.

您必须自己进行错误检查,但基本情况(当您返回到上一级别时)只是在没有其他可查找的情况下。

也许这有帮助,也许没有。祝你好运。

【讨论】:

    【解决方案2】:

    解决办法是不使用正则表达式。对于这类事情,它们还不够强大。

    你想要的是一个解析器——因为看起来你正在尝试匹配 HTML,所以有很多选择。

    【讨论】:

    • @snives yeh 取决于语言——antlr / lex-yacc / Spirit 可以解决问题。把这条评论放在这里,这样你就可以用谷歌搜索了。
    • 同意,简洁的回答。
    【解决方案3】:

    正则表达式不适用于此类数据。它本身并不规律。

    您应该为此使用 XML 解析器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      相关资源
      最近更新 更多