【问题标题】:Regex for matching different parts of a domain用于匹配域的不同部分的正则表达式
【发布时间】:2024-01-06 05:44:01
【问题描述】:

我正在尝试将域拆分为不同的类别(子域、域、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
域名:谷歌
*域名: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

与新的正则表达式匹配:

strawberry.apple.orange.banana.clevername.co.uk

子域:strawberry.apple.orange.banana.clevername
域名:
*域名:co.uk

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

【问题讨论】:

    标签: regex pcre splunk regex-group capture-group


    【解决方案1】:

    我相信这应该为你做到:

    \s((?&lt;subdomain&gt;[a-z0-9\.\-]*)\.)?(?&lt;domain&gt;[a-z0-9\-]{3,}(?=\.[a-z\.]{3,6}))\.(?&lt;tld&gt;[a-z\.]{3,6})\s

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

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

    例如,比较something.bit.lyclevername.com.au。没有外部信息,无法判断bitclevername 是域。

    【讨论】:

      【解决方案2】:

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

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

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

      注意:正则表达式明确指出domain 不能是com,如果需要支持其他{3 characters}.xyz tlds,则需要更新

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          最近更新 更多