youtube视频的正则表达式匹配模式是否可以非贪婪的方式完成?

时间:2015-03-19 00:35:57

标签: javascript regex regex-greedy

我有以下正则表达式模式,将youtube视频与我的独特模式 [URL] youtube url [/ URL]

相匹配
\[(url|u2b)](http|https):\/\/(m.|www.)?(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})(.*?)\[\/(url|u2b)]

这对于提取YouTube视频ID几乎是万无一失的,但是如果我在同一行上放置两个YouTube视频,则匹配将只有1个而不是2个。该模式试图将其作为一个整体进行匹配。

例如,如果我将两个youtube视频放在不同的行中,如下所示:

[url]https://www.youtube.com/watch?v=L9-Sr8RPty4[/url]
[url]https://www.youtube.com/watch?v=L9-Sr8RPty4[/url]

它完美无缺。

但是如果我尝试将这两个视频合并到同一行,那么我就遇到了问题,这只会导致一个格式不正确的匹配:

[url]https://www.youtube.com/watch?v=L9-Sr8RPty4[/url] [url]https://www.youtube.com/watch?v=L9-Sr8RPty4[/url]

顺便说一句,我在Javascript中用.replace函数做这一切。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是因为中间.+.*进行了匿名匹配。

\[(url|u2b)](http|https):\/\/(m\.|www\.)?(?:youtube\.com\/(?:[^\/]+\/(?:(?!\/?\1).)*\/|(?:v|e(?:mbed)?\/|(?:(?!\/?\1).)*[?&]v=)|youtu\.be\/))([^"&?\/ ]{11})(.*?)\[\/(url|u2b)]

我刚刚将中间.+.*?更改为(?:(?!\/?\1).)*。它在匹配每个字符之前检查条件。条件是,它检查要匹配的字符不会是第一次捕获中出现的字符串的起始字符( /(可选)或u )基。

DEMO