没有空格的多个网络链接的正则表达式?

Regex for multiple web links with no whitespace?

我正在尝试解析包含多个 YouTube 链接的字符串,但它们之间没有 white-space。链接也可以以 "http" 或 "https" 开头。示例字符串:

https://www.youtube.com/watch?v=abc123http://www.youtube.com/watch?v=abc123https://www.youtube.com/watch?v=abc123

所以里面有 3 个链接。我根本无法控制该字符串,因为它来自人们发布链接的聊天服务,然后我的工作是对 URL 进行正则表达式并记录下来。

这是我到目前为止提出的正则表达式:

(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/\S+

不过,当它看到字符串下方的模式时,我不确定如何让它中断。有人可以帮忙吗?

您可以在 http 上拆分,然后再将其添加回去:

var input = "https://www.youtube.com/watch?v=abc123http://www.youtube.com/watch?v=abc123https://www.youtube.com/watch?v=abc123";

var split = input.Split("http");

var urls = split.Select(x => "http" + x);

这当然假设 "http" 没有出现在 url 的其他任何地方...

如果您在创建字符串时添加了某种分隔符,例如 "|",那么您可以很容易地拆分它。

var videoUrls = input.Split("|");

这是一个正则表达式,它将拆分连接的链接。请注意,我已将链接重命名为 111、222 和 333,以便于调试:

string data = "https://www.youtube.com/watch?v=abc111http://www.youtube.com/watch?v=abc222https://www.youtube.com/watch?v=abc333";

string pattern = @"(?<YouTubeLink>https?.+?)(?=http|$)";

Regex.Matches(data, pattern)
     .OfType<Match>()
     .Select (mt => mt.Groups["YouTubeLink"].Value);

/* The above results in an IEnumerable of these strings:
https://www.youtube.com/watch?v=abc111
http://www.youtube.com/watch?v=abc222
https://www.youtube.com/watch?v=abc333
*/

解释:

  • (?< > ) : Named match capture for easier post regex processing data extraction.
  • s? : To capture http and the s is optional ? for https
  • .+? : capture as minimal as possible
  • (?= ) : Look ahead, to stop the .+? from grabbing more text.
  • http|$ : look ahead to stop on a new http or end of the data.