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

本文关键字:单独 Regex | 更新日期: 2023-09-27 18:14:29

我有以下可能的输入:

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

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

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

使用显式捕获

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

现在你可以这样做:

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

对应HostDnsSafeHost属性。注意,我的正则表达式还有一个额外的好处,可以捕获零个或多个级别的子域,如果您对它们感兴趣的话

你可以像这样强迫3个部分:

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

在位置上,顺序被强制为:
$1 = subdomain
$2 =域名
$3 =剩余

唯一必需的部分是域