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

Can a regex match pattern for youtube videos be done in a non-greedy way?

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

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

提取 youtube 视频 ID 几乎是万无一失的,但是如果我将两个 youtube 视频放在同一行,那么匹配将只有 1 个结果而不是两个。图案正试图作为一件来匹配。

例如,如果我将两个 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 函数完成了所有这些工作。

谢谢!

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

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

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

DEMO