2011-11-14 80 views
1

我有以下可能的輸入:正則表達式解析子域和域到不同的組

http://subdomain.domain.com/hello.html 
http://subdomain.domain.com 
https://subdomain.domain.com 
subdomain.domain.com 
http://domain.com/hello.html 
http://domain.com 
https://domain.com 
domain.com 

我想創建一個正則表達式,將捕獲和子成一組和域到另一個組。因此,考慮上面的例子中我會得到下面的比賽:

Sub Domain Group Domain Group 
-------------------------------- 
subdomain   domain.com 
subdomain   domain.com 
subdomain   domain.com 
subdomain   domain.com 
empty    domain.com 
empty    domain.com  
empty    domain.com 
empty    domain.com 
+0

你僅限於正則表達式,還是你使用這是一種編程語言? –

+0

使用正則表達式的C# – Thomas

回答

2
^(https?://)?((?<subdomain>[^\.]+)\.)?(?<domain>[^\./]+\.[^/]+)/?.*$ 

使用明確捕獲。

1

使用至少減少大部分手工的System.Uri(http://www.dotnetperls.com/uri)

現在你可以這樣做:

var regex = new Regex(@"^((?<subdomain>.+?)\.)*(?<domain>[^\.]*)$"); 

HostDnsSafeHost屬性。請注意,我的正則表達式已經捕捉零個或多個各級子域,如果額外的好處,他們感興趣的你

+0

'@「^(?:(?:????? [^。] +)。)*(? [^。] *)$」' – Qtax

+0

@Qtax:你的觀點是什麼?你使用了其他的子匹配('?:',不同的kleene代數用於非貪婪的匹配,呃,我的'[^ \。]'是一個錯誤嗎?我沒有測試它,但我認爲它可以逃脫即使不必要地點(其他答案也一樣) – sehe

0

你也許能夠迫使3個部分,它像這樣:

^(?:https?://)?([^/.]+(?=\.)|)\.?([^/.]+\.[^/]+)/?(.+|)$
編輯
^(?:https?://)?((?:[^/.]+(?=\.)\.?)*|)([^/.]+\.[^/.]+)/?(.+|)$得到全部單個組中的子域(包括點,所以可能需要拆分)。
作爲一個附註,我忘了.Net做一個Group對象,其中(?<name> something)*將捕獲一個'name'數組。所以,去與一個適當的溶液(@sehe或@qtax等)

在位置上,順序被強制進入這樣的:
$ 1 =子域
$ 2 =域
$ 3 =其餘

唯一需要的部分是域。