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
) 的起始字符第一个捕获组。
我有以下正则表达式模式,可将 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
) 的起始字符第一个捕获组。