为什么用正则表达式解析XML是个坏主意?

时间:2011-12-20 14:34:40

标签: xml regex xml-parsing

我刚刚回顾了我之前发过的一篇文章,并注意到有很多人建议我不使用正则表达式来解析xml。在这种情况下,xml相对简单,Regex没有任何问题。我还在解析许多其他代码格式,所以为了统一起见,它是有意义的。但我很好奇这可能会在其他情况下造成问题。这只是一个“不要重新发明轮子”的问题吗?

3 个答案:

答案 0 :(得分:37)

真正的麻烦是嵌套标签。使用正则表达式很难处理嵌套标记。这可能是balanced matching,但这只能在.NET中使用,也许还有其他几种。但即使有平衡匹配的力量,一个不合适的评论也可能会摒弃正则表达式。

例如,解析...这是一个棘手的问题。

<div>
    <div id="parse-this">
        <!-- oops</div> -->
        try to get this value with regex
    </div>
</div>

你可能会使用正则表达式追踪这样的边缘情况数小时,并且可能找到解决方案。但实际上,当有专门的XML,XHTML和HTML解析器可以更可靠,更有效地完成工作时,毫无意义。

答案 1 :(得分:5)

这已在SO上多次讨论过。参见例如

Can you provide some examples of why it is hard to parse XML and HTML with a regex?

Why it's not possible to use regex to parse HTML/XML: a formal explanation in layman's terms

只需点击屏幕右侧的链接即可获得更多答案。

我的结论:

简单,因为正则表达式不是解析器,它是查找模式的工具。

如果你想在(ht | x)ml文件中找到一个非常具体的模式,继续,正则表达式是完美的。

但是如果你在每个Foo标签中搜索某些东西,那可能有不同顺序的属性,可以嵌套,可能是格式错误(并且仍然有效),然后使用解析器,因为那不再是模式匹配

答案 2 :(得分:3)

XML不是常规语言(这是一个技术术语),因此您永远无法使用正则表达式正确解析它。 99%的情况下你可能会成功,但是有人会找到一种编写抛出你的XML的方法。

如果您正在编写某种屏幕刮刀,那么99%的成功率可能就足够了。对于大多数应用程序,它不是。