您是否可以使用<regex>?</regex>实现轻量级XML解析器

时间:2010-11-08 09:34:59

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

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

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

我认为学习新的C ++ 0x&lt; regex&gt;对我来说是一个很好的练习。图书馆。 但是,我想知道XML解析是否不会超过正常的正则表达式限制。

4 个答案:

答案 0 :(得分:11)

总之:不。 XML不是常规语言。

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

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

虽然您可以编写一个使用正则表达式执行lexing / tokenisation的基于状态机的解析器,但恕我直言这比使用适合该工作的工具效率更低,更容易出错。正如其他人所说,Flex / Bison是一种选择。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

相关问题