find456789
V2EX  ›  问与答

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

  •  
  •   find456789 · Oct 2, 2021 · 2649 views
    This topic created in 1869 days ago, the information mentioned may be changed or developed.

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

    <div>你好</div>
    

    方案 1:用 断言

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

    方案 2:用普通正则

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

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

    谢谢

    9 replies  •  2021-10-03 14:37:49 +08:00
    eason1874
    eason1874
    Oct 2, 2021
    1
    第一种会记住匹配结果的位置 index,第二种没有

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

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

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

    其实断言更有用的是,不得不回溯做一点事情的时候。。。
    passerbytiny
    passerbytiny
    Oct 3, 2021 via Android
    6
    第二种提取出来的是 “<div>你好</div>” ,并不是要求的 “你好”,这种行为对应一个典型的名词:跑题。
    autoxbc
    autoxbc
    Oct 3, 2021
    7
    第二种取结果时需要用数组下标,第一种不需要,核心问题是:正则作为一种嵌入式语言,是不是提供了足够的抽象能力,以及,这种抽象能力是不是对宿主语言无依赖
    wdssmq
    wdssmq
    Oct 3, 2021❤️1
    8
    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
    alanhe421
    Oct 3, 2021
    9
    ....断言是为了解决位置,本身不匹配任何内容
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1734 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 04:48 · PVG 12:48 · LAX 20:48 · JFK 23:48
    ♥ Do have faith in what you're doing.