html - 正则表达式和 HTML 不混合的根本原因是什么?它背后的理论是什么?

标签 html regex parsing pattern-matching

首先,我只能引用我认为是有史以来最著名的 SO 帖子:

RegEx match open tags except XHTML self-contained tags

现在,这甚至是 StackOverflow 的问题吗?我不知道,但我会尝试...

我从个人角度说说。虽然我从来没有这样做过,但我知道在我必须解析 HTML 的那一天,我肯定不会使用正则表达式;我会尝试找到一个 HTML 解析库。很好。

但我不知道为什么。

有一次,我决定用 Java 进行 CSS 验证。我“凭胆量”知道正则表达式不会削减它,所以我使用了 Parboiled .

我也不知道为什么。

“为什么”困扰着我。我根本不是正则表达式的新手。我无法明确区分正则表达式引擎可以做什么和不能做什么。

我的问题如下:这条清晰的线是什么?输入的什么基本特征必须存在,以便在数学上证明任何正则表达式引擎都不能可靠地确定成功和失败?

您能否提供一个简单的、理论上的输入,这将导致正则表达式引擎无法提供可靠的“匹配/不匹配”答案?如果是,这种输入的定义特征是什么?

编辑 为了便于讨论,我将添加一个由 SO 上的帖子建议的任务(对不起,我目前找不到链接),它比HTML,但我不会对其使用正则表达式:shell 命令行解析。

就 shell 而言,它们是等价的:

alias ll="ls -l"
alias ll=ls\ -l
alias l"l"=ls' -'l
"alia"s l"l= "ls\ -l

Shell 引用机制如此之多,在这种情况下我将只创建一个 Parboiled 语法... 但这“超出了我的胆量”。因为我发现它可能更容易... 但这并不能证明这对正则表达式不可行。

最佳答案

正则表达式可以判断regular languages .但是 HTML 不是一种常规语言。这是一个 context-free language .上下文无关语言是常规语言的超集。

基本上任何可以包含递归元素的语言都是不规则的。常规语言必须是“扁平化”的,所以不能有嵌套。例如,在 HTML 中,一个 <div>可以嵌套在另一个里面,并且它们可以嵌套的深度没有限制。这是正则表达式无法处理的一般嵌套类型。

关于html - 正则表达式和 HTML 不混合的根本原因是什么?它背后的理论是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17054995/

相关文章:

css - 页脚导航

Javascript 监听器捕获当前加载资源的 URL

html - Xidel 提取标签内的数据——原始输出

javascript - 如何计算javascript html字符串变量中的行数

html - 在angularjs中获取当前行及其值

javascript正则表达式最里面的括号不被引号包围

c# - 出现特殊词后搜索

javascript - 正则表达式(javascript),调试器,Regex101

c++ - spirit 解析器输出中的附加符号

php - 避免php中http_build_query中HTML实体的转换