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

正则表达式 (AB|CD)+? 与 ^(AB|CD)+?$的区别

  •  1
     
  •   zzzkkk · 271 天前 · 921 次点击
    这是一个创建于 271 天前的主题,其中的信息可能已经有所发展或是发生改变。

    试了 php 和 ruby

    匹配字符串 ABCD

    加了^$ 匹配到的是 CD

    不加是 AB

    什么原因啊 不是都该返回 AB 因为懒惰匹配?

    10 条回复    2023-08-07 21:33:01 +08:00
    itskingname
        1
    itskingname  
       271 天前
    在 Python 中,不加时能同时得到 AB 和 CD ,加了只有 CD

    ```
    >>> import re
    >>> re.findall('(AB|CD)+?', 'ABCD')
    ['AB', 'CD']
    >>> re.findall('^(AB|CD)+?$', 'ABCD')
    ['CD']
    ```
    corningsun
        2
    corningsun  
       271 天前
    ^ 的意思是要求被匹配的字符串,必须是字符串开头

    ^(AB|CD)+?$ 对 CDXXX 就可以匹配到 CD 了。
    qwq11
        3
    qwq11  
       271 天前 via Android
    我觉得应该 AB 和 CD 都被找到才是对的,测试了发现只有.net 是两个都找到了
    x77
        4
    x77  
       271 天前 via Android   ❤️ 1
    正则表达式语言真的是个非常糟糕的设计,这玩意就是给机器看的,与人类文化格格不入,完全不考虑使用成本和体验
    glouhao
        5
    glouhao  
       271 天前
    原来各种语言解释还是不一样的
    Rache1
        6
    Rache1  
       271 天前
    个人理解是他还要满足 `\$` 的情况,所以最终拿到的是 CD 。
    NoOneNoBody
        7
    NoOneNoBody  
       271 天前
    有意思的话题

    我只知道这个涉及“正则回溯”的原理,不过我还不怎么理解这个原理
    大致意思就是当正则遇到不能满足的匹配(整字符串)时,则向前回溯找可匹配的部分
    回溯还有优先级和是否贪婪的因素在内
    反正我脑子不好使,看了不少文章都没弄明白
    NoOneNoBody
        8
    NoOneNoBody  
       271 天前
    这个按回溯的理解步骤是
    1.(AB|CD)-->AB 成功
    2.^AB 成功,-->AB
    3.向右 AB$,不成功
    4.回溯最后成功的 2 ,另外选择-->CD
    5.向右 CD$成功

    问题就是第 4 步应该回溯到 2 还是回溯到 1 ,回溯到 1 的话,应该没有结果,因为^CD 也是不成功的
    尤其,这个在不同语言表现有区别,这就让我越看越糊涂了
    DianAvA
        9
    DianAvA  
       271 天前
    @x77 确实难看又难用,还好现在可以交给 ChatGPT 生成
    L0L
        10
    L0L  
       270 天前
    感觉是 $ 起了作用,要匹配到结束符;^(AB|CD)+? 就只会匹配到 AB
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2408 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:54 · PVG 17:54 · LAX 02:54 · JFK 05:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.