C# Regex将子域和域解析为单独的组

C# Regex将子域和域解析为单独的组,c#,regex,C#,Regex,我有以下可能的投入: 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 我正在尝试创建一个正则表达式,它将捕获域和子域到一个组中,并将域捕获到另一个组中。鉴于上

我有以下可能的投入:

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
^(https?:/)?((?[^\.]+)\)?(?[^\./]+\.[^/]+)/*$

使用显式捕获。

通过使用System.Uri,至少可以减少一些手工操作(http://www.dotnetperls.com/uri)

现在您可以执行以下操作:

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

针对
Host
DnsSafeHost
属性。请注意,my regex还具有捕获零级或更高级别子域的附加好处,如果您感兴趣,您可以像这样强制执行3个部分:

^(?:https?:/)?([^/]+(?=\)\)\.?([^/]+\.[^/]+)/?(.+)$

编辑
或者
^(?:https?:/)?((?:[^/]+(?=\)\?)*|)([^/]+\..^/]+)/?(.+\)$
获取单个组中的所有子域(包括点,因此可能需要拆分)。
作为旁注,我忘记了.Net有一个组对象,其中
(?something)*
将捕获一个“name”数组。所以,用它来寻找一个合适的解决方案(@sehe或@qtax,等等)

在位置上,订单被强制进入以下位置:
$1=子域
$2=域名
3美元=其余的


唯一需要的部分是域。

您是仅限于正则表达式,还是使用这是一种编程语言?使用带正则表达式的C^(?(?[^.]+)\)*(?[^.]*)$”@Qtax:您的观点是什么?您使用了其他子匹配(
?:
,不同的kleene代数用于非贪婪匹配。Meh.我的
[^\.]
是一个错误吗?我没有测试它,但我认为即使不必要也可以逃出点(其他答案也一样)
var regex = new Regex(@"^((?<subdomain>.+?)\.)*(?<domain>[^\.]*)$");