如题,比如匹配和
,<>里的内容是不固定的,但必须成对出现,正则表达式能描述这种情况吗? 1
3dwelcome 2021-12-05 00:21:23 +08:00
肯定可以吧,这就是标准的 regex match 。
正常来说,可以当成 xml 去解析。但是我爬取 html 页面时,括号什么一般都是不标准的,不一定成对出现。 浏览器容错能力又上天,可苦了我们这种手动解析的。 |
2
xarthur 2021-12-05 00:36:17 +08:00 via iPhone
如果是 xml ,试着直接解析 dom 树?
|
3
autoxbc 2021-12-05 00:41:03 +08:00
用正则解析 html 是如此泛滥的一个错误以致在 stackoverflow 上阻止这么做成了一个段子
|
4
Dreax 2021-12-05 02:20:24 +08:00 1
|
5
lqs 2021-12-05 02:28:04 +08:00 via iPhone
不可以,正则表达式只能匹配正则语言。
|
6
GuuJiang 2021-12-05 05:02:36 +08:00 via iPhone 4
先说结论,标准的正则表达式是无法匹配的,非正则语言中的一个经典例子就是成对的括号
但是,今天的各种正则表达式引擎中增加了各种扩展语法,其中有两种语法能够解决这个问题,一种是递归引用,一种是带计数器操作,详情参见 https://www.regular-expressions.info/refrecurse.html 不过严格来说,这两种扩展语法已经不能算作正则表达式了,这两个语法相比起其它一些扩展语法有着本质的区别,其它一些扩展语法仅相当于语法糖,没有改变仅能匹配正则语言这一边界,但是这两种语法能够匹配部分非正则语言,从实现原理来说,匹配正则语言只需要用到 DFA ,而类似成对括号这种包含递归或计数的场景则必须使用下推自动机 |
7
3dwelcome 2021-12-05 13:44:19 +08:00 via Android
|
8
GuuJiang 2021-12-05 14:13:09 +08:00
@3dwelcome
除去我上面提到的扩展语法以外,标准的正则表达式仅能匹配正则语言,而“成对的括号”属于典型的非正则语言,从正则语言的定义就能断定不可能存在这样的表达式,我再举个非正则语言中的最简单例子 “若干个 a 后面跟若干个 b ,a 和 b 的数量相等” 不使用递归或计数等扩展语法,能够匹配这样的串的正则表达式也是不存在的 至于为什么一定要把这两种扩展语法独立出来讨论,上面以及解释过了,仅使用 DFA 是不可能实现这两种语法的 |
9
LeeReamond OP @GuuJiang 的意思应该是正则本质上是状态机模型无法描述这种情况,也算是说明的同时证明了
|