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

yat*_*aka 25 regex xml xml-parsing

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

Ste*_*ham 40

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

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

<div>
    <div id="parse-this">
        <!-- oops</div> -->
        try to get this value with regex
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

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


ste*_*ema 6

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

您能否举例说明为什么用正则表达式解析XML和HTML很困难?

为什么不可能使用正则表达式来解析HTML/XML:外行人的术语中的正式解释

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

我的结论:

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

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

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

  • @AK_ XPath 不是一种正则表达式。*[XPath](http://en.wikipedia.org/wiki/XPath) 是一种用于从 XML 文档中选择节点的查询语言*。这与正则表达式无关。我怀疑你是否理解我的回答。问题不在于正则表达式不理解递归,他们理解:[参见regular-expression.info](http://www.regular-expressions.info/recurse.html)。问题是 (ht|x)ml 可能看起来如此不同,但结果相同。付出很多努力[你可以用正则表达式解析 (ht|x)ml](http://stackoverflow.com/a/4234491/626273),但现有的解析器使用起来要简单得多 (2认同)

Mic*_*Kay 6

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

如果您正在编写某种屏幕抓取工具,那么 99% 的成功率可能就足够了。对于大多数应用程序来说,事实并非如此。

  • 我从未见过使用正则表达式解析 XML 的尝试,该正则表达式不会破坏某些内容(例如,注释或 CDATA 部分中类似 XML 的内容)。因此,使用正则表达式的唯一可接受的情况是您不介意它并不总是有效。 (3认同)
  • 正则表达式最初设计为仅处理正则语言,但现代实现包括环视、反向引用,有时还包括平衡匹配。这允许您尝试使用稍微复杂的语言...但是对于像 XML 或 html 这样复杂的语言来说它仍然不够。 (2认同)