正则表达式可以匹配 html 标签这种成对的内容吗?

2021-12-04 23:43:28 +08:00
 LeeReamond

如题,比如匹配

,<>里的内容是不固定的,但必须成对出现,正则表达式能描述这种情况吗?

1785 次点击
所在节点    问与答
9 条回复
3dwelcome
2021-12-05 00:21:23 +08:00
肯定可以吧,这就是标准的 regex match 。

正常来说,可以当成 xml 去解析。但是我爬取 html 页面时,括号什么一般都是不标准的,不一定成对出现。

浏览器容错能力又上天,可苦了我们这种手动解析的。
xarthur
2021-12-05 00:36:17 +08:00
如果是 xml ,试着直接解析 dom 树?
autoxbc
2021-12-05 00:41:03 +08:00
用正则解析 html 是如此泛滥的一个错误以致在 stackoverflow 上阻止这么做成了一个段子
Dreax
2021-12-05 02:20:24 +08:00
lqs
2021-12-05 02:28:04 +08:00
不可以,正则表达式只能匹配正则语言。
GuuJiang
2021-12-05 05:02:36 +08:00
先说结论,标准的正则表达式是无法匹配的,非正则语言中的一个经典例子就是成对的括号
但是,今天的各种正则表达式引擎中增加了各种扩展语法,其中有两种语法能够解决这个问题,一种是递归引用,一种是带计数器操作,详情参见 https://www.regular-expressions.info/refrecurse.html
不过严格来说,这两种扩展语法已经不能算作正则表达式了,这两个语法相比起其它一些扩展语法有着本质的区别,其它一些扩展语法仅相当于语法糖,没有改变仅能匹配正则语言这一边界,但是这两种语法能够匹配部分非正则语言,从实现原理来说,匹配正则语言只需要用到 DFA ,而类似成对括号这种包含递归或计数的场景则必须使用下推自动机
3dwelcome
2021-12-05 13:44:19 +08:00
@GuuJiang
“先说结论,标准的正则表达式是无法匹配的"

爬虫里用正则提取文本是很常规的操作,没什么不可以吧。
又不是真的用正则去解析一个完整的 Html 树结构,不过是提取其中一小段文本内容。
GuuJiang
2021-12-05 14:13:09 +08:00
@3dwelcome
除去我上面提到的扩展语法以外,标准的正则表达式仅能匹配正则语言,而“成对的括号”属于典型的非正则语言,从正则语言的定义就能断定不可能存在这样的表达式,我再举个非正则语言中的最简单例子
“若干个 a 后面跟若干个 b ,a 和 b 的数量相等”
不使用递归或计数等扩展语法,能够匹配这样的串的正则表达式也是不存在的
至于为什么一定要把这两种扩展语法独立出来讨论,上面以及解释过了,仅使用 DFA 是不可能实现这两种语法的
LeeReamond
2021-12-05 14:54:31 +08:00
@GuuJiang 的意思应该是正则本质上是状态机模型无法描述这种情况,也算是说明的同时证明了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/820095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX