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

珍爱生命,不懂就问,_brief 后面这个 brief 是正则表达式的什么关键字吗?

  •  
  •   maxwell29 · 2023-06-24 13:06:25 +08:00 · 787 次点击
    这是一个创建于 510 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天在分析 rsshub 的源码,看到下面这一句: const matches = response.data.match(/images/(\d{4}-\d{2}/\d{2})/\d{2}/\d+_brief/);

    我能知道这个是一个正则表达式,但是_后面接的那个 brief ,实际替代的是一个_pdf.pdf,这个 brief 是正则表达式的内容吗?我查了一些资料没有搞明白,正则表达式没有这个关键词吧?

    麻烦路过的兄弟指个方向,卡壳太难受了。

    5 条回复    2023-06-24 13:51:36 +08:00
    blankmiss
        1
    blankmiss  
       2023-06-24 13:12:36 +08:00
    这种东西 让 chatgpt 回答就可以了
    ```
    这段代码是在使用正则表达式( regular expression )匹配字符串中的特定模式。具体来说,它会在 response.data 字符串中查找符合以下规则的子字符串:

    子字符串以 "images/" 开头,后面跟着一个形如 "yyyy-mm/dd" 的日期格式,例如 "2021-05/01"。
    日期格式后面跟着 "/dd",表示日期中的日,其中 dd 是一个两位数字,例如 "01"。
    子字符串以一个或多个数字结尾,中间跟着 "_brief"。
    如果在 response.data 中找到符合上述规则的子字符串,它就会被存储在 matches 变量中。matches 变量是一个数组,包含所有匹配到的子字符串及其匹配到的子表达式(如果有的话)。在这种情况下,matches[0] 包含整个匹配到的子字符串,而 matches[1] 则包含日期部分的子字符串。
    ```
    maxwell29
        2
    maxwell29  
    OP
       2023-06-24 13:20:16 +08:00
    @blankmiss
    这一句话
    “子字符串以一个或多个数字结尾,中间跟着 "_brief"。”怎么理解?
    代码的效果最后没有_brief,而是_pdf.pdf ,
    这个 brief 是指后面接着任何短语吗?
    maxwell29
        3
    maxwell29  
    OP
       2023-06-24 13:22:43 +08:00
    @blankmiss 它实际运行出来的结果是这个 /images/2023-06/23/A1/20230623A1_pdf.pdf
    blankmiss
        4
    blankmiss  
       2023-06-24 13:50:43 +08:00
    自己找个 gpt 问一问不就好了
    geelaw
        5
    geelaw  
       2023-06-24 13:51:36 +08:00   ❤️ 2
    那个表达式不是

    /images/(\d{4}-\d{2}/\d{2})/\d{2}/\d+_brief/

    而是

    /images\/(\d{4}-\d{2}\/\d{2})\/\d{2}\/\d+_brief/

    缺少 \ 会导致语言把 /images/ 理解为一个正则表达式,从而出错。

    提问的时候应该链接上下文,单看一句是很难看懂的。这段代码位于

    https://github.com/DIYgod/RSSHub/blob/457e8f8a41c80bbd251bf40da2dd25648270a37f/lib/v2/hnrb/index.js#L24

    假设 id 是空,这里的代码先 GET https://hnrb.voc.com.cn/hnrb_epaper 然后查找响应内容里面 URL=(.*)" 匹配中对应 .* 的结果,自己访问一下这个页面发现 URL=(.*)" 会匹配 <meta equiv="http-refresh" 里面的重定向地址,因此这个 GET 是为了得到最新地址。

    第二步是 GET 这个最新地址,然后用正则表达式匹配得到的是 <img src=../../../images/2023-06/24/01/2023062401_brief.jpg 里面的 images/... 的内容,第一组的内容是 2023-06/24 (这个结果当然是随着时间变化的)。

    所以并不存在你说的从正则表达式直接到 _pdf.pdf 这一步,它后面还对返回数据进行了各种加工。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5423 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:04 · PVG 15:04 · LAX 23:04 · JFK 02:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.