正则表达式,用于匹配YouTube嵌入ID

时间:2019-05-10 01:11:58

标签: javascript regex regex-group regex-greedy

我使用的是非现代JavaScript,我定义的字符串如下:

"//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0"

我只想抽出DmYK479EpQc,但我不知道长度。我确实知道我想要/之后和?

之前的内容

是否有一些简单的JavaScript可以解决此问题?

6 个答案:

答案 0 :(得分:2)

使用URL对象吗?

console.log(
   (new URL("//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0", location.href)).pathname
   .split('/')
   .pop());

为什么?因为我很可能会组成一个破坏正则表达式的URL(尽管对于youtube来说这不太可能)

答案 1 :(得分:1)

This expression可能会帮助您,并且可能会更快:

(d\/)([A-z0-9]+)(\?)

enter image description here

此图显示了表达式的工作方式,您可以在此link中可视化其他表达式:

enter image description here

const regex = /(.*)(d\/)([A-z0-9]+)(\?)(.*)/gm;
const str = `//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0`;
const subst = `$3`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

性能测试

此JavaScript代码段使用简单的100万次for循环来显示该表达式的性能。

const repeat = 1000000;
const start = Date.now();

for (var i = repeat; i >= 0; i--) {
	const string = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';
	const regex = /(.*)(d\/)([A-z0-9]+)(\?)(.*)/gm;
	var match = string.replace(regex, "$3");
}

const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match  ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test.  ");

答案 2 :(得分:1)

非正则表达式如何

console.log("//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0".split('/').pop().split('?')[0]);

答案 3 :(得分:0)

一个选项使用正则表达式替换:

var url = "//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0";
var path = url.replace(/.*\/([^?]+).*/, "$1");
console.log(path);

上面的正则表达式模式表明:

.*       match and consume everything up to and
/        including the last path separator
([^?]+)  then match and capture any number of non ? characters
.*       then consume the rest of the input

然后,我们只替换为第一个捕获组,该捕获组对应于最终路径分隔符之后但查询字符串开始之前的文本,如果URL有一个。

答案 4 :(得分:0)

我不会给出一段代码,因为这是一个相对简单的算法,易于实现。

请注意,这些链接具有这种格式(如果我输入错了,请纠正我):

  • https://http://
  • www.youtube.com/
  • embed/
  • 视频ID(在这种情况下为DmYK479EpQc
  • ?parameters(请注意,它们始终以字符?开头)

您需要视频的ID,因此可以将字符串拆分为这些部分,如果将​​这些部分存储在一个数组中,则可以确保ID位于第3个位置。

该数组的外观示例如下:

['https://', 'www.youtube.com', 'embed', 'DmYK479EpQc', '?vq=hd720&rel=0']

答案 5 :(得分:0)

您可以使用此正则表达式

.*匹配并消耗掉所有内容 [A-z0-9]+然后匹配并捕获A-z之间的任何数字和字符 .*然后使用其余的输入

const ytUrl = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';
const regex = /(.*)(d\/)([A-z0-9]+)(\?)(.*)/gm;
const position = '$3';

let result = ytUrl.replace(regex, position);

console.log('YouTube ID: ', result);

此正则表达式只是将字符串分成不同的部分,而YouTube ID位于第3位。

另一个解决方案是使用split。此方法将字符串拆分为子字符串数组。

const ytUrl = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';

let result = ytUrl.split('/').pop().split('?').shift()

console.log('YouTube ID: ', result);

在此示例中,我们使用/作为分隔符来拆分URL。然后,我们使用pop方法获取数组的最后一个元素。最后,我们再次使用?作为分隔符进行拆分,并使用shift方法获取数组的第一个元素。