分层正则表达式

时间:2010-02-11 00:13:56

标签: regex hierarchy hierarchical

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

例如:

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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.

您必须自己完成错误检查,但基本情况(当您返回到上一级别时)就是没有其他任何东西可以找到。

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

答案 2 :(得分:0)

正则表达式不适用于此类数据。这本身并不常见。

您应该使用XML解析器。