2015-02-06 4 views
1

Я пытаюсь разобрать строку, содержащую несколько ссылок на YouTube, но между ними нет пробелов. Ссылки могут также начинаться с «http» или «https». Пример строки:Regex для нескольких веб-ссылок без пробелов?

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

Так 3 ссылки есть. У меня нет контроля над этой строкой вообще, поскольку она исходит из службы чата, в которой люди размещают ссылки, а затем моя работа заключается в повторном URL-адресе и записи.

Вот Regex я придумал до сих пор:

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

Я не уверен, как сделать это перерыв, когда он видит образец далее вниз строку, хотя. Может ли кто-нибудь помочь?

+1

Вы все еще можете разделить на «http», а затем добавить каждую строку с «http» после разделения. –

+1

Что вы подразумеваете под словом «* break * when see»? Вы имеете в виду Brake/stop или забрать другую ссылку HTTP в добавленном тексте? Если текст больше, добавьте его в пример. – OmegaMan

ответ

2

Настоящее регекс, в котором будут разбиты соединенные ссылки. Обратите внимание, что я переименовал ссылки на 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 
*/ 

Объяснение:

  • (?< >): Названный захват матча для облегчения после регулярных выражений извлечения обработки данных.
  • s?: Для того, чтобы захватить HTTP и s является необязательным ? для протокола HTTPS
  • .+?: захват минимально возможного
  • (?= ): Посмотрите вперед, чтобы остановить .+? от захвата больше текста.
  • http|$: загляните в будущее, чтобы остановиться на новом http или конце данных.
+0

Это прекрасно, спасибо. –

4

Вы можете просто разделить на 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» не появляется нигде в URLs ...

+0

Очень прагматичный, хорошо замеченный. –

0

Если вы добавили разделитель какого-то типа, как "|", когда вы создали строку, тогда вы можете легко разделить на нее.

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

Это данность, но похоже, что ОП уже знает об этом, и добавил бы, если бы смог, трубку, пробел или какой-то другой разделитель. –

+0

Я не думаю, что это данность, он был неспецифичен о том, откуда эта строка. –

+0

Жаль, ребята, вот сейчас. У меня нет контроля над этой ссылкой вообще, поскольку она исходит из службы чата, в которую люди публикуют ссылки, а затем моя работа - повторно вывести URL-адрес и записать их. –