这个article认为正则表达式不能与嵌套结构匹配,因为正则表达式是有限自动机。
然后,他提供了一个问题列表,其中的答案表明使用正则表达式无法解决以下问题:自2& 3可以想象包含括号;这种嵌套对于正则表达式是无法解决的。 但为什么不能匹配XML元素? (他没有举例)。
答案 0 :(得分:3)
如果您事先知道要匹配的标记,则可以匹配有限的HTML标记子集。
但是你不能(可靠地或很好地)解析任意HTML。它不是常规语言。
答案 1 :(得分:1)
您如何将此有效XML与正则表达式匹配?
<!--<d>>--<<--><div class='foo' id="bar" inline></div>
就像制作一辆木制车。当然你可以尝试这样做,但为什么呢?
然后是解析 XML的部分。如何使用有限的一组组从无限的元素集中提取一组可能无限的属性?由于正则表达式的性质和结构,它只是不。
答案 2 :(得分:1)
有理论答案,基于XML的语法类型以及正则表达式可以匹配的语法类型。这些答案有时会因为我们今天使用的大多数正则表达式库都可以执行计算机科学中定义的正式正则表达式无法做到的事情(如反向引用)这一事实。
并且有实际的答案。实际的答案是:不要这样做,因为这是工作的错误工具,你的代码将难以编写和不可维护,它将是低效的,它将有错误,没有人会知道如何改变它文件的结构发生了变化。并且因为有更好的工作工具,称为XML解析器。
答案 3 :(得分:0)
正则表达式没有状态。要解析 XML文件,您需要使用state。 <
可能表示打开XML元素。如果它在评论<!-- < -->
或属性值"<"
中,但它意味着其他内容。使用Regexen,您只能根据其他事物之前或之后的事物来表达事物。要正确解析<
作为打开XML元素,您需要表达以下内容:
<
但<!--
之后,如果<!--
后面没有-->
而后"
"
"
"
}没有关闭,但仅当<
是属性时,因为<
作为文本值对下一个{{1}}没有影响,如果没有...
而只针对一个简单的{{1}} ,甚至没有涵盖所有可能性。有一些XML特殊字符都具有相同的循环条件。构建一个正确表达所有这些条件的正则表达式几乎是不可能的。但是,对于状态机来说,它是微不足道的。