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

询问一个正则表达式问题

  •  
  •   huyinjie · 2020-03-01 01:00:32 +08:00 · 1355 次点击
    这是一个创建于 1739 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想要提取淘宝商品链接 Url 里的 id,但在下面第一条测试中遇到了些问题,会把后面"trackid=2"也识别进去

    我用的正则表达式:

    ^.+id=(\d+)(&?)
    

    测试 Url 如下

    https://item.taobao.com/item.htm?id=598384050583&ali_trackid=2:mm_31395756_17858613_64290316:1582994613_109_29192307&pvid=null&scm=null
    
    https://item.taobao.com/item.htm?spm=a230r.1.14.44.60c43f398SnbJg&id=596339389459&ns=1&abbucket=14#detail
    
    https://item.taobao.com/item.htm?spm=a230r.1.14.44.60c43f398SnbJg&ns=1&abbucket=14#detail&id=596339389459
    

    https://i.loli.net/2020/03/01/UzRL4DNFXgH8CYB.png

    8 条回复    2020-03-01 13:46:48 +08:00
    ciqulover
        1
    ciqulover  
       2020-03-01 02:30:38 +08:00   ❤️ 1
    ```
    [&?]id=(\d+)
    ```
    imn1
        2
    imn1  
       2020-03-01 02:49:39 +08:00
    ^.+id=(\d+)
    就这样不行么?贪婪就可以了
    你写的也可以,只提取 match1 就是了,match2 舍弃,match0 为全部
    autoxbc
        3
    autoxbc  
       2020-03-01 04:08:03 +08:00   ❤️ 1
    每次用正则解析序列化的结构数据,就是重新写了一遍这种数据结构的解析器

    >>> new URI('https://item.taobao.com/item.htm?id=598384050583&ali_trackid=2:mm_31395756_17858613_64290316:1582994613_109_29192307&pvid=null&scm=null').search(true).id
    "598384050583"
    >>> new URI('https://item.taobao.com/item.htm?spm=a230r.1.14.44.60c43f398SnbJg&id=596339389459&ns=1&abbucket=14#detail').search(true).id
    "596339389459"
    >>> new URI('https://item.taobao.com/item.htm?spm=a230r.1.14.44.60c43f398SnbJg&ns=1&abbucket=14#detail&id=596339389459').search(true).id
    undefined

    注意第三条之所以没有成功获取,是因为 url 本身就不包含合法的 id,那个 id=596339389459 位于 # 符号之后,会被作为 Location hash 的一部分,而不是 Location search 的一部分。如果一个程序从非法的数据中提取到了结果,只能说这个程序写错了

    url 是个稍微有点复杂的东西,希望任何人不要试图用正则处理 url,除非你是解析器的作者

    在 JavaScript 环境中,上面的 URI() 来自 URI.js ,也可以用全局对象 URL 中的 searchParams,相信其他语言里也有对应的解析库
    ETiV
        4
    ETiV  
       2020-03-01 08:55:01 +08:00 via iPhone   ❤️ 1
    \bid=(\d+)

    \b= boundary
    mrytsr
        5
    mrytsr  
       2020-03-01 09:30:50 +08:00 via Android   ❤️ 1
    \b
    huyinjie
        6
    huyinjie  
    OP
       2020-03-01 13:32:42 +08:00
    @imn1 #2 这样的话第一条 url 只能取到 2
    huyinjie
        7
    huyinjie  
    OP
       2020-03-01 13:33:18 +08:00
    @ETiV #4
    @mrytsr #5
    感谢 忘了还有\b
    imn1
        8
    imn1  
       2020-03-01 13:46:48 +08:00   ❤️ 1
    细看了一下,关键是 ali_trackid= 里面也有“id=”,边界混淆了
    所以,前面的正则基本都没什么问题,你在 id=前面加上[^A-Za-z] 或者\b 等等把边界厘清就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1194 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:12 · PVG 07:12 · LAX 15:12 · JFK 18:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.