询问一个正则表达式问题

2020-03-01 01:00:32 +08:00
 huyinjie

想要提取淘宝商品链接 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

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

>>> 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
2020-03-01 08:55:01 +08:00
\bid=(\d+)

\b= boundary
mrytsr
2020-03-01 09:30:50 +08:00
\b
huyinjie
2020-03-01 13:32:42 +08:00
@imn1 #2 这样的话第一条 url 只能取到 2
huyinjie
2020-03-01 13:33:18 +08:00
@ETiV #4
@mrytsr #5
感谢 忘了还有\b
imn1
2020-03-01 13:46:48 +08:00
细看了一下,关键是 ali_trackid= 里面也有“id=”,边界混淆了
所以,前面的正则基本都没什么问题,你在 id=前面加上[^A-Za-z] 或者\b 等等把边界厘清就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/648731

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX