【问题标题】:Spotify urls regexSpotify 网址正则表达式
【发布时间】:2018-06-15 13:42:53
【问题描述】:

我在使用正则表达式时遇到了一些问题。基本上我想要做的是将这些类型的任何一种 spotify url 用于播放列表

https://open.spotify.com/user/spotify/playlist/37i9dQZF1DZ06evO2ZpGiQ?si=-6S0EBlURrao__YyIOW6bg

spotify:user:spotify:playlist:37i9dQZF1DZ06evO2ZpGiQ

获取这些 URL 的用户 ID,即 spotify,并希望获取这些 URL 的播放列表 ID,即 37i9dQZF1DZ06evO2ZpGiQ

我还想要一些正则表达式来确保它是这些 URL 类型之一。

到目前为止,我已经尝试过这个正则表达式来检查它是否是一个使用这个正则表达式的 spotify url:

^(spotify:|https:\/\/[a-z]+\.spotify\.com\/) 但它只匹配顶部 URL。

【问题讨论】:

    标签: javascript regex spotify


    【解决方案1】:

    在这里,我得到每个候选字符串的不可变部分,即第一组中的 https://open.spotify.com/user/spotify/playlistspotify: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]+)(.*)$

    【讨论】:

    • 这很好用,它确实给了我播放列表 ID,但它也不会检索用户 ID。我将如何添加它?
    • 我根据您的回答将其更新为^(https:\/\/open.spotify.com\/user\/([a-zA-Z0-9]+)\/playlist\/|spotify:user:([a-zA-Z0-9]+):playlist:)([a-zA-Z0-9]+)(.*)$,它似乎获取了我需要的所有信息,您有什么要更改的吗?
    • 哦,我没有意识到第二个 Spotify 是用户 ID,不,看起来一切都很好。
    • 不完整,Spotify 用户名可以包含点和破折号,例如 spotify:user:ege.basaran:playlist:0HVvyU1bvNsyBWEpbc7N2M
    【解决方案2】:

    对于您给定的示例,您还可以使用替换 | 匹配用户 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(group 2)以匹配非正斜杠
    • \1playlist\1 使用 2 个反向引用匹配播放列表(如 :playlist:/playlist/
    • ([a-z0-9]+) 正在捕获播放列表 ID(group 3

    Regex demo

    您可以使用不区分大小写的标志/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]);
      }
    });

    【讨论】:

      【解决方案3】:

      这相当简单,只需使用字符类即可。

      工作示例:https://regex101.com/r/eQFWuR/1

      正则表达式spotify[\/:]playlist[\/:](.+)[\s?]

      【讨论】:

      • @IamNguele 我觉得没关系
      • 它也不捕获播放列表 ID。
      • @IamNguele 是的
      • 现在可以了哈哈哈
      • @IamNguele 呵呵
      猜你喜欢
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多