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

我只是审查了我以前的一篇文章,并注意到一些人建议我不使用正则表达式来解析XML。 在这种情况下,XML是相对简单的,正则表达式没有任何问题。 我也在解析一些其他的代码格式,所以为了统一起见,这是有道理的。 但我很好奇在其他情况下这可能会造成问题。 这只是一个“不要重蹈覆辙”的问题?

真正的麻烦是嵌套标签。 嵌套标签很难用正则表达式来处理。 平衡匹配是可能的,但是这只能在.NET中使用,也许还有一些其他的风格。 但即使有平衡匹配的权力,一个不适当的评论也可能会抛出正则表达式。

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

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

你可以用正则表达式来追踪这样的边缘案例几个小时,也许找到一个解决方案。 但实际上,当有专门的XML,XHTML和HTML解析器可以更加可靠和高效地完成工作时,就毫无意义。

在这里已经讨论了很多次了。 见例如

你能提供一些为什么很难用正则表达式来解析XML和HTML的例子吗?

为什么使用正则表达式来解析HTML / XML是不可能的:用外行人的形式作出正式的解释

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

我的结论是:

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

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

但是,如果您在每个Foo标签中搜索某些内容,那么它们可能具有不同顺序的属性,可以嵌套,可以变形(仍然有效),然后使用解析器,因为它们不再是模式匹配。

XML不是一种常规的语言(这是一个技术术语),所以你将永远无法使用正则表达式正确解析它。 99%的时间你可能会成功,但是有人会找到一种方法来编写引发你的XML。

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