正在获取 YouTube 视频、频道或 none

Fetching YT video, channel or none

给定一个 url 列表,我如何将它分成 3 个总和列表?

一个用于 YT 视频,第二个用于 YT 频道,第三个用于所有其他?

const paragraph1 = 'www.youtube.com/watch?v=NsjeEt1ZpqQ';
const regex1 = /www.youtube.com/(\c*)(watch?v=)?<videoId>[A-Z,0-9])/gi;

const paragraph2 = 'https://www.youtube.com/channel/UCKqFqiCe1dCUxRe0_YNZ6gg';                                 
const regex2 = /www.youtube.com/channel/?<channelId>[A-Z,_,0-9])/gi;

const found = paragraph1.match(regex1);
console.log(found);
// expected output: Array ["T", "I"]

const found = paragraph2.match(regex2);
console.log(found);

已尝试在此 site 上进行沙盒处理。

由于您打算将一些 URL 字符串列表拆分为三个不同的部分,您可以使用三种不同的模式:

www\.youtube\.com\/watch\?v=(?<videoId>\S+)
www\.youtube\.com\/channel\/(?<videoId>\S+)
www\.youtube\.com(?!\/(?:channel\/|watch\?v=))\S*

查看 regex #1, regex #2 and regex #3 演示。请注意,您需要一个符合 ECMAScript 2018+ 的 JavaScript 环境才能使命名的捕获组工作。另外,请注意点在它们表示文字点的任何地方都被转义了。

模式的意思

  • www\.youtube\.com\/watch\?v= - 文字 www.youtube.com/watch?v= 字符串
  • (?<videoId>\S+) - 组“videoId”:一个或多个 non-whitespace 个字符
  • www\.youtube\.com\/channel\/(?<videoId>\S+) - 文字 www.youtube.com/channel/ 字符串,然后组“videoId”捕获一个或多个 non-whitespace 个字符
  • www\.youtube\.com(?!\/(?:channel\/|watch\?v=))\S* - www.youtube.com 字符串,然后是匹配失败的否定前瞻,如果紧靠右侧有一个 / 字符,则 channel/watch?v=,然后消耗零个或多个 non-whitespace 个字符。

如果您打算再次对某些 mark-up 文本使用这些模式,请确保从 \S 模式中减去 mark-up 个字符,即将其更改为否定字符class 与反向 shorthand、[^\s],并在 \s 之后添加字符。比如说,如果链接在双引号内,请将 " 放在那里,[^\s"].