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
^(https?://)?((?<subdomain>[^'.]+)'.)?(?<domain>[^'./]+'.[^/]+)/?.*$
使用显式捕获
使用System至少可以减少一些手工工作。Uri (http://www.dotnetperls.com/uri)
现在你可以这样做:
var regex = new Regex(@"^((?<subdomain>.+?)'.)*(?<domain>[^'.]*)$");
对应Host
或DnsSafeHost
属性。注意,我的正则表达式还有一个额外的好处,可以捕获零个或多个级别的子域,如果您对它们感兴趣的话
你可以像这样强迫3个部分:
^(?:https?://)?([^/.]+(?='.)|)'.?([^/.]+'.[^/]+)/?(.+|)$
编辑
或^(?:https?://)?((?:[^/.]+(?='.)'.?)*|)([^/.]+'.[^/.]+)/?(.+|)$
在单个组中获得所有子域(包括点,因此可能需要拆分)。作为旁注,我忘记了。net做了一个组对象,其中(?<name> something)*
将捕获一个"name"数组。所以,用它来寻找合适的解决方案(@sehe或@qtax等)
在位置上,顺序被强制为:
$1 = subdomain
$2 =域名
$3 =剩余
唯一必需的部分是域