虽然比较容易想出examples that demonstrates the non-viability of regexes for this task或用collection of expressions代表这个概念,但我仍然无法找到一个正式的解释为什么这是不可能做的外行人的术语。
到目前为止,我可以在这个网站上找到的唯一正式的解释可能是非常准确的,但是对于自学的程序员来说也很隐蔽:
the flaw here is that HTML is a Chomsky Type 2 grammar (context free
grammar) and RegEx is a Chomsky Type 3 grammar (regular expression)
要么:
Regular expressions can only match regular languages but HTML is a
context-free language.
要么:
A finite automaton (which is the data structure underlying a regular
expression) does not have memory apart from the state it’s in,and if
you have arbitrarily deep nesting,you need an arbitrarily large
automaton,which collides with the notion of a finite automaton.
要么:
The Pumping lemma for regular languages is the reason why you can’t do
that.
[公平:上述解释的大部分链接到维基百科页面,但是这些不比答案本身更容易理解]。
所以我的问题是:可能有人请提供一个翻译的外行人的上述正式解释为什么不可能使用正则表达式解析(X)HTML / XML?
编辑:阅读第一个答案后,我想我应该澄清:我正在寻找一个“翻译”,也简要解释了它试图翻译的概念:在答案的结尾,读者应该有一个粗略的想法 – 例如 – 什么是“正规语言”和“上下文无关语法”的意思…
A finite automaton (which is the data structure underlying a regular
expression) does not have memory apart from the state it’s in,which collides with the notion of a finite automaton.
正则表达式的定义等同于对一个字符串是否与模式匹配的测试可以通过有限自动机(每个模式一个不同的自动机)来执行。有限自动机没有内存 – 没有堆栈,没有堆,没有无限的磁带。它所有的是有限数量的内部状态,每个可以从被测试的字符串中读取一个输入单元,并使用它来决定移动到下一个状态。作为特殊情况,它有两个终止状态:“是,匹配”,和“不,不匹配”。
另一方面,HTML具有可以任意嵌套的结构。要确定文件是否是有效的HTML,您需要检查所有结束标记是否与以前的开始标记相匹配。要理解它,你需要知道哪个元素被关闭。没有任何方法来“记住”你看到什么开头的标签,没有机会。
注意,大多数“regex”库实际上允许不仅仅是正则表达式的严格定义。如果他们可以匹配反向引用,那么它们超出了常规语言。所以,你不应该使用一个regex库在HTML上的原因是一个比一个简单的事实,HTML不是常规复杂一点。