【问题标题】:Would you implement a lightweight XML parser with <regex>?你会用 <regex> 实现一个轻量级的 XML 解析器吗?
【发布时间】:2011-05-06 13:49:50
【问题描述】:

如果你必须实现一个轻量级的 XML 解析器,你会选择使用正则表达式吗?

在我的例子中,XML 解析是最简化的:只有标签和文本内容。没有命名空间,没有属性,没有模式支持(一开始肯定是,但也许......)。

我认为学习新的 C++0x 库对我来说是一个很好的练习。 但是,我想知道 XML 解析是否不会超出正则表达式的限制。

【问题讨论】:

  • 相关:stackoverflow.com/questions/1732454#1732454(它是关于 XHTML,但我认为它仍然适用。另外,它很棒)。
  • @SpaceCowboy 嗯,这完全相关... ;-)
  • Bobince 的回答是荒诞艺术的伟大和平。我喜欢这个。
  • 我的意思是 “伟大的荒诞艺术作品” ;-)

标签: c++ xml regex c++11


【解决方案1】:

如果我必须这样做,我会使用真正的词法分析器/解析器生成器,例如 flex/yacc。是的,开始工作需要做更多的工作,但是一旦您支付了设置成本,添加对附加功能的支持就会容易得多。此外,flex 和 yacc 已经经过数十年的优化,因此它们生成的代码比您手工编写的任何代码都要快。

【讨论】:

    【解决方案2】:

    一句话:没有。 XML 不是常规语言。

    更新 (根据以下cmets中的讨论进行扩展)

    XML 不是规则的,因此您不能希望使用正则表达式对整个文件/字符串执行某种一次性解析/拆分操作。

    虽然您可以编写一个基于状态机的解析器,该解析器使用正则表达式来执行词法分析/标记化,但恕我直言,与使用专门用于该工作的工具相比,这会效率较低且更容易出错。正如其他人所说,Flex/Bison 是一种选择。

    【讨论】:

    • @Oli 这是正则语言的定义en.wikipedia.org/wiki/Regular_language XML 成为非正则语言的原因是什么?
    • @Stephane:出于同样的原因,由平衡的括号对构成的语言不规则(星号引理)。但是,答案具有误导性,我怀疑您会编写一个巨大的正则表达式来解析整个 XML 文件。
    • 这个答案完全没有抓住重点。正则表达式和(有时令人惊讶的非常规)正则表达式都用于解析非常规语言 - 您只是不要在单个表达式中执行此操作。例如,您可以将这些表达式与其他答案中提到的大多数解析器生成器一起使用。
    • @Roger,好吧,你的意思是结合正则表达式和 lex/yacc/bison ?
    • @Stephane:实际上,结合 &lt;regex&gt; 和 yacc/bison,或者删除 &lt;regex&gt; 并使用 (f)lex。但如果练习是使用 C++0x,请使用 &lt;regex&gt; 并编写自己的解析器(XML 被设计为易于解析)。
    【解决方案3】:

    我写了一个轻量级的 XML 解析器,但我没有使用正则表达式。 如果您只使用 XML 的一个子集,这很容易做到。只需逐个字符读取 XML,并使用一堆布尔值(如 in_a_tag)更新状态。它比你用正则表达式做的任何事情都要快,而且你不必处理行或内存的问题(尝试匹配一行?整个文档?如果一行上有几个元素怎么办?如果一个标签怎么办?是 2 行吗?)

    【讨论】:

      【解决方案4】:

      如果你真的需要解析 XML:不要,获取一个真正的 XML 解析器。

      如果您只是想通过练习来获得一些新的 C++0x 正则表达式库的经验:尝试找到一个更好、更有用的项目。首先,您需要有可能在以后使用的东西(参见上面关于真正的 XML 解析器的内容)。也就是说,有更糟糕的方法来学习正则表达式库。 :)

      【讨论】:

      • 是的,这就是我今天下午一直在想的。暂时不用理会 lex yacc。我将使用我现在非常习惯的 MSXML。我会想出一个使用正则表达式的更简单的解释器设计模式,但仍然不知道如何/在哪里,我稍后会弄清楚。
      猜你喜欢
      • 2011-01-09
      • 1970-01-01
      • 2010-11-03
      • 2012-10-24
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      相关资源
      最近更新 更多