4

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

例如:

<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 项目。

4

3 回答 3

5

解决方案是不使用正则表达式。对于这种事情,他们的力量还不够。

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

于 2010-02-11T00:18:17.723 回答
2

尝试使用 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.

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

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

于 2010-02-11T00:17:58.973 回答
0

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

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

于 2010-02-11T00:17:07.473 回答