想要提取淘宝商品链接 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
1
ciqulover 2020-03-01 02:30:38 +08:00 1
```
[&?]id=(\d+) ``` |
2
imn1 2020-03-01 02:49:39 +08:00
^.+id=(\d+)
就这样不行么?贪婪就可以了 你写的也可以,只提取 match1 就是了,match2 舍弃,match0 为全部 |
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,相信其他语言里也有对应的解析库 |
4
ETiV 2020-03-01 08:55:01 +08:00 via iPhone 1
\bid=(\d+)
\b= boundary |
5
mrytsr 2020-03-01 09:30:50 +08:00 via Android 1
\b
|
8
imn1 2020-03-01 13:46:48 +08:00 1
细看了一下,关键是 ali_trackid= 里面也有“id=”,边界混淆了
所以,前面的正则基本都没什么问题,你在 id=前面加上[^A-Za-z] 或者\b 等等把边界厘清就行了 |