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

正则表达式 里的 断言,是不是没啥用?

  •  
  •   find456789 · 2021-10-02 21:54:44 +08:00 · 1837 次点击
    这是一个创建于 1148 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如针要从下方 html 里提取出 你好:

    <div>你好</div>
    

    方案 1:用 断言

    (?<=<div>).*(?=<\/div>)
    

    方案 2:用普通正则

    <div>(.*)<\/div>
    
    

    我感觉明显方案 2 更简单,那么 断言存在的价值是什么? 是不是有什么特殊的应用场景?

    谢谢

    9 条回复    2021-10-03 14:37:49 +08:00
    eason1874
        1
    eason1874  
       2021-10-02 22:33:44 +08:00
    第一种会记住匹配结果的位置 index,第二种没有

    处理字符串,有时候位置很重要。不过我写正则都很短,没写过太复杂的,具体场景不了解
    ch2
        2
    ch2  
       2021-10-02 22:42:48 +08:00
    是不是有什么特殊的应用场景?
    使用断言的匹配结果是不含<div>的,你不需要额外从结果里把<div>去掉
    shadows
        3
    shadows  
       2021-10-02 22:52:33 +08:00   ❤️ 2
    方案一只会匹配到“你好”
    方案而二匹配结果是“<div>你好</div>”
    这就是区别啊
    weakish
        4
    weakish  
       2021-10-02 23:00:00 +08:00   ❤️ 2
    因为这个场景太简单了。

    比如,把「你好」替换成「您好」,然后外面包围的不一定是 div 可能是 span 、p 等等标签,那用断言可以直接匹配到,最后的替换字符串就是「您好」。不用断言,就需要三个 group,替换字符串类似 `$1 您好$3`。如果条件更复杂,group 数会爆炸,还会出现 group 嵌套 group,可读性就更差。

    再比如校验密码复杂性,最少最多几个字符,同时包含大小写字母数字特殊符号等等,用断言写就比较方便。
    ipwx
        5
    ipwx  
       2021-10-02 23:24:07 +08:00
    @weakish group 套 group 可以用不捕获的 group 搞定。

    其实断言更有用的是,不得不回溯做一点事情的时候。。。
    passerbytiny
        6
    passerbytiny  
       2021-10-03 08:07:11 +08:00 via Android
    第二种提取出来的是 “<div>你好</div>” ,并不是要求的 “你好”,这种行为对应一个典型的名词:跑题。
    autoxbc
        7
    autoxbc  
       2021-10-03 09:11:41 +08:00
    第二种取结果时需要用数组下标,第一种不需要,核心问题是:正则作为一种嵌入式语言,是不是提供了足够的抽象能力,以及,这种抽象能力是不是对宿主语言无依赖
    wdssmq
        8
    wdssmq  
       2021-10-03 12:15:52 +08:00   ❤️ 1
    oBody = oBody.replace(/<(?!((\/?\s?blockquote)|(\/?\s?ol)|(\/?\s?ul)|(\/?\s?li)|(\/?\s?img)|(\/?\s?br)|(\/?\s?hr)|(\/?\s?table)|(\/?\s?tr)|(\/?\s?th)|(\/?\s?td)|(\/?\s?p)))[^>]+>/g,"");
    alanhe421
        9
    alanhe421  
       2021-10-03 14:37:49 +08:00
    ....断言是为了解决位置,本身不匹配任何内容
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2801 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:59 · PVG 21:59 · LAX 05:59 · JFK 08:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.