没有一天没有关于解析(X)HTML或XML与正则表达式被询问的问题。

虽然比较容易想出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不是常规复杂一点。

为什么不可能使用正则表达式来解析HTML/XML:用外行人的术语的正式解释的更多相关文章

  1. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  3. xcode – Cordova plugin.xml添加“Header Search Paths”条目

    我希望将Cordova插件添加到Xcode项目后,在“HeaderSearchPaths”下添加一个新条目.如何在Cordovaplugin.xml文件中进行配置?

  4. ios – 有关多个连接/提要/视图的XML解析的设计/实现建议

    >我应该在每个视图中都有解析器类/对象或解析XML提要吗?

  5. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  6. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  7. iOS的相当于Android的colors.xml的是什么?

    如果没有,组织整个应用程序使用的颜色的最佳方法是什么?

  8. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  9. iOS中的XML转换为JSON

    我需要将XML响应转换为JSON.我的XML响应:我正在使用本网站的XMLReader支持文件:XMLReader我正在使用此代码将XML转换为JSON我收到了JSON响应:我需要这样的回应:我在线转换时得到这个回应.如何获得这样的回应提前致谢.解决方法此代码不会将任何内容转换为JSON.它给你一个NSDictionary.您需要从字典中实际创建JSON数据.尝试这个大小.

  10. ios – Info.plist格式不正确

    解决方法plist文件是严格指定格式的XML文档;XML和PropertyList结构都有非常严格的规则.如果您尝试手动编辑info.plist(即文本),您可以轻松搞砸事情,方法是打开Asas>源代码:您不太可能正确使用此格式.因此,您应该始终使用OpenAs>编辑info.plist.物业清单:这允许属性列表编辑器为您生成XML,并且不太可能在生成的XML结构中出错.当然,我想你仍然可能搞砸某些东西的价值……

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部