【问题标题】:Regex domains with TLD when multiple subdomains多个子域时具有 TLD 的正则表达式域
【发布时间】:2017-06-24 00:04:06
【问题描述】:

我有一长串域的子域,如下所示:

www.random.com
abc.api.random.co.uk
abc.def.api.random.ac.za
something.edu
another.random.net
random.pharmacy

每个条目上有 0 到多个子域(例如 abc.def.api.random.ac.za)。我试图弄清楚如何仅提取域和 TLD。例如,鉴于上述输出,我正在寻找:

random.com
random.co.uk
random.ac.za
something.edu
random.net
random.pharmacy

这有点超出我目前对正则表达式的理解。看来我们需要检查一下:

【问题讨论】:

    标签: regex subdomain


    【解决方案1】:

    您需要的正则表达式是:

    \w+(?:\.\w\w)?\.\w+$
    

    是:

    • \w+ 表示一个或多个字母或数字
    • (?:\.\w\w)? 是一个可选组,匹配一个句点后跟两个字母
    • \.\w+ 匹配句点和其余字母
    • $ 是行尾

    demo

    如果你想不那么通用:

    \w+(?:\.(?:co|ac))?\.\w+$
    

    如果您想更精确,您需要用句点指定整个 eTLD(有效顶级域):

    \w+(?:\.(?:co\.uk|ac\.za)|\.\w+)$
    

    demo

    如果您想了解所有有效的顶级域名,Mozilla Foundation 提供了一个不错的目录,名为 Public Suffix List

    【讨论】:

      【解决方案2】:

      还有一点值得深思。

      您可以使用 *(零个或多个)和 +(一个或多个)进行重复,但是您也可以指定范围 {x,y}(x 或更多,但不超过 y)。

      这可能很有用,因为倒数第二个域很可能是您的 tld 的一部分,如果它正好是 2 个字符长。

      正如 horcrux 指出的那样,您肯定希望使用 $(行尾)标记,因为您将从右侧工作。

      \w+.(\w{2}.)?\w+$

      (...)?意味着捕获组中的任何内容都是可选的。因此,它正在寻找 EXACTLY 2 个字母后跟一个小数,作为可选的中间条目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 2011-12-17
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        相关资源
        最近更新 更多