2011-03-21 49 views
1

我確信這已經是相當多次了,但儘管我已經檢查了所有類似的問題,但我無法想出解決方案。c#正則表達式 - 在命名組之後匹配optionals

問題是我輸入的網址類似於;

  1. http://www.justin.tv/peacefuljay
  2. http://www.justin.tv/peacefuljay#/w/778713616/3
  3. http://de.justin.tv/peacefuljay#/w/778713616/3

我想它的段塞部分相匹配(在以上示例中,這是peacefuljay)。

我到目前爲止試過的正則表達式是;

http://.*\.justin\.tv/(?<Slug>.*)(?:#.)? 
http://.*\.justin\.tv/(?<Slug>.*)(?:#.) 

但我不能拿出解決方案。要麼它在第一個網址或其他網站失敗。

幫助讚賞。

回答

2

在我看來,沒有理由的「鼻涕蟲」後處理的部分。

因此,您只需要匹配主機之後不是「/」或「#」的所有字符。

http://.*\.justin\.tv/(?<Slug>[^/#]+)

3

解析URI的最簡單的方法是使用Uri類:

string justin = "http://www.justin.tv/peacefuljay#/w/778713616/3"; 
Uri uri = new Uri(justin); 
string s1 = uri.LocalPath; // "/peacefuljay" 
string s2 = uri.Segments[1]; // "peacefuljay" 

如果insisnt上一個正則表達式,你可以嘗試成才更具體一點:

Match mate = Regex.Match(str, @"http://(\w+\.)*justin\.tv(?:/(?<Slug>[^#]*))?"); 
  • (\w+\.)* - 確保您匹配域,而不是字符串中的其他任何地方(例如,散列或查詢字符串)。
  • (?:/(?<Slug>[^#]*))? - 可選組與您需要的字符串。 [^#]限制你期望在你的slu see中看到的角色,所以它應該消除後面額外組的需要。
+0

感謝這個實際上是解決辦法,但在我的情況,我用正則表達式來實現這一點 - 因爲我遠遠的URL來解析這我不能解析它們全部用uri細分。 – HuseyinUslu 2011-03-21 09:42:01

+0

其實,你越多,正則表達式就越複雜。除非你正在進行URL重寫,這有時侷限於正則表達式,這應該是更好的選擇。這也將處理棘手的網址,例如'http://www.justin.tv/ warandhate?source = justin.tv/peacejay',目前在您的正則表達式中失敗。無論如何,我已經添加了一個正則表達式。 – Kobi 2011-03-21 10:18:40

+0

感謝您的正則表達式方法。實際上,我的網站是直播前的一個,一個是Ustream的,等等。所以每個人都會有特定的正則表達式來處理。 – HuseyinUslu 2011-03-21 10:26:15

0
http://.*\.justin\.tv/(?<Slug>.*)#*? 

http://.*\.justin\.tv/(?<Slug>.*)(#|$)