提问人:yatakaka 提问时间:12/20/2011 更新时间:6/16/2012 访问量:29291
为什么使用正则表达式解析 XML 是个坏主意?[已结束]
Why is it such a bad idea to parse XML with regex? [closed]
问:
我刚刚回顾了我之前发表的一篇文章,并注意到很多人建议我不使用正则表达式来解析 xml。在这种情况下,xml 相对简单,正则表达式不会造成任何问题。我还解析了许多其他代码格式,因此为了统一起见,这是有道理的。但我很好奇这在其他情况下会如何构成问题。这只是一个“不要重新发明轮子”类型的问题吗?
答:
真正的麻烦是嵌套标签。嵌套标签很难用正则表达式处理。平衡匹配是可能的,但这仅在 .NET 中可用,也许还有其他几种风格。但是,即使具有平衡匹配的强大功能,一个位置不当的注释也可能会使正则表达式失去正则表达式。
例如,这是一个难以解析的问题......
<div>
<div id="parse-this">
<!-- oops</div> -->
try to get this value with regex
</div>
</div>
你可以用正则表达式追逐这样的边缘情况几个小时,也许能找到一个解决方案。但实际上,当有专门的 XML、XHTML 和 HTML 解析器可以更可靠、更高效地完成工作时,这是没有意义的。
评论
这在 SO 上已经讨论过很多次了。例如,参见
您能否举例说明为什么很难使用正则表达式解析 XML 和 HTML?
为什么不能使用正则表达式来解析 HTML/XML:通俗易懂的正式解释
只需点击屏幕右侧的链接即可获得更多答案。
我的结论:
很简单,因为正则表达式不是解析器,而是查找模式的工具。
如果你想在 (ht|x)ml 文件中找到一个非常具体的模式,请继续,正则表达式是完美的选择。
但是,如果你在每个 Foo 标签中搜索一些东西,这些东西可能具有不同顺序的属性,可以嵌套,可以格式错误(但仍然有效),那么请使用解析器,因为这不再是模式匹配。
评论
XML 不是一种常规语言(这是一个技术术语),因此您永远无法使用正则表达式正确解析它。你可能在99%的时间里都成功了,但随后有人会找到一种方法来编写让你失望的XML。
如果你正在编写某种屏幕抓取工具,那么 99% 的成功率可能就足够了。对于大多数应用程序来说,事实并非如此。
评论
r'[\s \t,]*("[^"]+"|\'[^\']+\'|[^ \t,]+)[ \t,]*'
r'[\s \t]*([+-]?"[^"]+"|\'[^\']+\'|[^ \t]+)[ \t]*'
评论