2

我正在尝试将域分成不同的类别(子域、域、TLD)并且遇到了麻烦..

我想不出一种方法来匹配任意数量的子域并且不超过我的域或 TLD 数学。我正在使用 PCRE 正则表达式。

当前正则表达式:

\s(?:(?<subdomain>[a-z0-9\-]*){0,1}\.){0,3}(?<domain>(?>([a-z0-9\-]+)))\.(?<tld>[a-z\.]{2,6})\s

数据集:

 apple.orange.banana.clevername.co.uk 
 strawberry.apple.orange.banana.clevername.co.uk 
 tangerine.com.au
 simple.com

注意:域前后都有空格,它们总是小写。

此数据如何匹配的示例:

apple.orange.banana.clevername.co.uk

子域:apple.orange.banana
域:google顶级域名
:co.uk

如果我将另一个水果添加到子域(strawberry.apple.orange.banana.clevername.co.uk),匹配将失败。如果我将子域正则表达式的 {0,3} 修改为更高数量或无限数量的匹配,它会变得过于贪婪,并且我不再得到域/tld 的正确匹配。这个例子:

修改正则表达式:

\s(?:(?<subdomain>[a-z0-9\-]*){0,1}\.){0,5}(?<domain>(?>([a-z0-9\-]+)))\.(?<tld>[a-z\.]{2,6})\s

结果与新的正则表达式匹配:

草莓.苹果.橙.香蕉.聪明名字.co.uk

子域:strawberry.apple.orange.banana.clevername
域:
tld:co.uk

我确信正则表达式也不是最有效的,因此我们将不胜感激任何帮助或建议。谢谢!

4

3 回答 3

0

我相信这应该为您做到:

\s((?<subdomain>[a-z0-9\.\-]*)\.)?(?<domain>[a-z0-9\-]{3,}(?=\.[a-z\.]{3,6}))\.(?<tld>[a-z\.]{3,6})\s

在 Splunk 中对此进行了测试,它适用于您的测试数据集。

请注意,这不适用于非常短的域,bit.ly因为如果不查找 TLD,就无法从子域中区分域。

例如,比较something.bit.lyclevername.com.au。没有外部信息,就无法分辨,bit并且clevername是域。

于 2013-10-24T19:32:58.730 回答
0

您可以尝试找到仍在公共后缀列表中列出的域的最长后缀。之后,拆分字符串应该很容易。

请注意,该列表还将网络托管商的域视为公共后缀。例如,在example.blogspot.com公共后缀中被认为是blogspot.com,不是com。此外,必须仔细分析该列表,因为它包含注释和例外。

于 2020-09-17T20:09:37.327 回答
0

我最近遇到了同样的问题。所以我采用了 Syon 的正则表达式并对其进行了一些修改。这是结果:

\s(?:(?<subdomain>[a-z0-9\.\-]*)\.)?(?<domain>(?!com)[a-z0-9\-]{3,}(?=\.[a-z\.]{2,}))\.(?:(?<tld>[a-z\.]{2,})$)\s

它适用于整个测试数据集(尽管我修剪了空格),以及像bit.ly. 也适用于新的顶级域,如.cancerresearch. 查看结果: https ://regex101.com/r/nX6yQ7/4

注意:正则表达式特别声明domaincan't be com,如果{3 characters}.xyz tlds需要支持其他需要更新

于 2015-07-29T09:53:35.103 回答