V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

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

  •  
  •   LeeReamond · 2021-12-04 23:43:28 +08:00 · 1954 次点击
    这是一个创建于 1071 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,比如匹配

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

    9 条回复    2021-12-05 14:54:31 +08:00
    3dwelcome
        1
    3dwelcome  
       2021-12-05 00:21:23 +08:00
    肯定可以吧,这就是标准的 regex match 。

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

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

    爬虫里用正则提取文本是很常规的操作,没什么不可以吧。
    又不是真的用正则去解析一个完整的 Html 树结构,不过是提取其中一小段文本内容。
    GuuJiang
        8
    GuuJiang  
       2021-12-05 14:13:09 +08:00
    @3dwelcome
    除去我上面提到的扩展语法以外,标准的正则表达式仅能匹配正则语言,而“成对的括号”属于典型的非正则语言,从正则语言的定义就能断定不可能存在这样的表达式,我再举个非正则语言中的最简单例子
    “若干个 a 后面跟若干个 b ,a 和 b 的数量相等”
    不使用递归或计数等扩展语法,能够匹配这样的串的正则表达式也是不存在的
    至于为什么一定要把这两种扩展语法独立出来讨论,上面以及解释过了,仅使用 DFA 是不可能实现这两种语法的
    LeeReamond
        9
    LeeReamond  
    OP
       2021-12-05 14:54:31 +08:00
    @GuuJiang 的意思应该是正则本质上是状态机模型无法描述这种情况,也算是说明的同时证明了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1357 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:00 · PVG 08:00 · LAX 16:00 · JFK 19:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.