如何用正则表达式匹配提取Spotify链接中的playlist id
从Spotify链接提取Playlist ID的正确实现
问题背景
需要从两种常见的Spotify播放列表链接中提取固定长度的Playlist ID:
- 无查询参数的链接:
https://open.spotify.com/playlist/1GXN1gZMuTlW5LjpTNJF2q - 带查询参数的链接:
https://open.spotify.com/playlist/1GXN1gZMuTlW5LjpTNJF2q?si=d3fa4293e26049f8
预期提取结果:1GXN1gZMuTlW5LjpTNJF2q
问题排查
你写的正则(?<=\/playlist\/)(.*)(?=\?|$)本身在大部分标准正则引擎中可以运行,但存在两个缺陷:
.*为贪婪匹配,若链接中出现多个问号的极端场景,会匹配到最后一个问号位置,导致结果出错- 部分低版本正则引擎对组合前瞻的支持不完善,可能出现匹配失败的情况
正确实现方案
推荐正则写法
优先使用兼容性更强、逻辑更简洁的两种写法:
- 环视匹配写法(适配所有支持固定长度正向后视的引擎,直接返回匹配结果,无需取分组):
逻辑说明:匹配(?<=\/playlist\/)[^?]+/playlist/之后所有非问号的字符,自动截止到问号或字符串末尾,完全覆盖两种链接场景。 - 分组捕获写法(兼容性最高,适配所有正则引擎,取第1个捕获组内容即可):
\/playlist\/([^?]+)
常用语言实现示例
Python示例
import re url_list = [ "https://open.spotify.com/playlist/1GXN1gZMuTlW5LjpTNJF2q", "https://open.spotify.com/playlist/1GXN1gZMuTlW5LjpTNJF2q?si=d3fa4293e26049f8" ] pattern = re.compile(r'\/playlist\/([^?]+)') for url in url_list: res = pattern.search(url) if res: print(res.group(1)) # 输出均为:1GXN1gZMuTlW5LjpTNJF2q
JavaScript示例
const urlList = [ "https://open.spotify.com/playlist/1GXN1gZMuTlW5LjpTNJF2q", "https://open.spotify.com/playlist/1GXN1gZMuTlW5LjpTNJF2q?si=d3fa4293e26049f8" ] const pattern = /\/playlist\/([^?]+)/ urlList.forEach(url => { const res = url.match(pattern) if (res) console.log(res[1]) }) // 输出均为:1GXN1gZMuTlW5LjpTNJF2q
内容的提问来源于stack exchange,提问作者Kishan Sripada
相关产品推荐
相关产品推荐

