2015-02-06 25 views
1

我試圖解析一個包含多個YouTube鏈接的字符串,但它們之間沒有空白。鏈接也可以以「http」或「https」開頭。示例字符串:正則表達式爲多個Web鏈接,沒有空白?

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+ 

我不知道如何使它打破,當它進一步看到一個模式下的字符串,但。誰能幫忙?

+1

你仍然可以在「http」上分割,然後在分割之後用「http」預先加上每個字符串。 – 2015-02-06 17:19:16

+1

什麼意思是「當看到」時*突破*?你的意思是剎車/停止或拿起另一個HTTP鏈接添加文本?如果有更多文本,則將其添加到示例中。 – OmegaMan 2015-02-06 19:07:59

回答

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

這很完美,謝謝。 – 2015-02-06 20:29:15

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」沒有其他地方出現在網址...

+0

非常務實,很好的發現。 – 2015-02-06 20:29:38

0

如果你加入某種分隔符,例如"|",當您創建字符串時,您可以輕鬆地將其拆分。

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

這是給定的,但它聽起來像OP已經知道它,並且如果他能夠,它會添加管道,空白區域或其他分隔符。 – 2015-02-06 17:56:39

+0

我不認爲這是給定的,他沒有具體說明這個字符串是從哪裏來的。 – 2015-02-06 19:23:31

+0

對不起,現在在這裏。我完全無法控制該鏈接,因爲它來自人們發佈鏈接的聊天服務,然後我的工作是將URL重新排列並記錄下來。 – 2015-02-06 20:27:53