我和Regex有麻烦了。基本上,我想做的是把这两种类型的spotify urls中的任何一种作为播放列表。
https://open.spotify.com/user/spotify/playlist/37i9dQZF1DZ06evO2ZpGiQ?si=-6S0EBlURrao__YyIOW6bg
或
spotify:user:spotify:playlist:37i9dQZF1DZ06evO2ZpGiQ
并获取用户id,它将是这些URL的spotify,并希望获得播放列表id,它将是这些URL的37i9dQZF1DZ06evO2ZpGiQ。
我也希望有一些正则表达式,以确保它是这些URL类型之一。
到目前为止,我已经尝试使用这个regex来检查它是否是spotify url:
^(spotify:|https:\/\/[a-z]+\.spotify\.com\/),但它只匹配顶部的URL。
发布于 2018-06-15 13:58:30
在这里,我得到每个候选字符串的不可变部分,即第一个组中的https://open.spotify.com/user/spotify/playlist和spotify:user:spotify:playlist,然后在第二个组中捕获播放列表id,其余部分可以忽略。
你可以在工作中看到它:https://regex101.com/r/tDtsTS/1
^(https:\/\/open.spotify.com\/user\/spotify\/playlist\/|spotify:user:spotify:playlist:)([a-zA-Z0-9]+)(.*)$
发布于 2018-06-16 11:19:12
对于给定的示例,您还可以使用替换|匹配用户id和播放列表id,在第一部分中,您还不希望捕获值并在捕获组([\/:])中捕获分隔符。然后您可以使用反向引用\1。
然后,您可以引用相同的组号作为用户名和播放列表。用户名将在第2组中,播放列表在第3组中。
^(?:https:\/\/open\.spotify\.com|spotify)([\/:])user\1([^\/]+)\1playlist\1([a-z0-9]+)
详细信息
^在行开始处的断言位置(?:非捕获群https:\/\/open\.spotify\.com匹配字面上(转义点\.来匹配它)|或spotify匹配
)闭非捕获群([\/:])使用字符类捕获组中的/或:,以便它可以与对该组的反向引用一起使用(组1)user\1匹配user,后面是反向引用\1([^\/]+)使用否定字符类捕获用户id (组2),以匹配而不是正斜杠。\1playlist\1匹配播放列表(如:playlist:或/playlist/)([a-z0-9]+)捕获播放列表id (组3)可以使用不区分大小写的标志/i来匹配大写字符和小写字符。
const strings = [
'https://open.spotify.com/user/spotify/playlist/37i9dQZF1DZ06evO2ZpGiQ?si=-6S0EBlURrao__YyIOW6bg',
'spotify:user:spotify:playlist:37i9dQZF1DZ06evO2ZpGiQ'
];
let regex = /^(?:https:\/\/open\.spotify\.com|spotify)([\/:])user\1([^\/]+)\1playlist\1([a-z0-9]+)/gi;
strings.forEach((str) => {
while ((m = regex.exec(str)) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
console.log("user id: " + m[2]);
console.log("playlist id: " + m[3]);
}
});
发布于 2018-06-15 13:49:21
https://stackoverflow.com/questions/50876850
复制相似问题