【问题标题】:regex match main domain name正则表达式匹配主域名
【发布时间】:2012-10-07 20:05:01
【问题描述】:

我需要能够识别任何子域的域名。

例子:

对于所有这些,我只需要匹配 example.co / example.com / example.org / example.co.uk / example.com.au / example.gov.us 等等

www.example.co
www.first.example.co
first.example.co
second.first.example.co
no.matter.how.many.example.co
first.example.co.uk
second.first.example.co.uk
no.matter.how.many.example.co.uk
first.example.org
second.first.example.org
no.matter.how.many.example.org
first.example.gov.uk
second.first.example.gov.uk
no.matter.how.many.example.gov.uk

我整天都在玩正则表达式,整天都在谷歌上搜索,但似乎还是找不到。

Edit2:我更喜欢在 t.co 等非常奇怪的情况下可能会失败的正则表达式,然后列出所有 TLD 并列出我没有列出但可能被预测失败并匹配更多的 TLD。这不是您会选择的选项吗?

更新: 使用选择的答案作为指导,我构建了这个为我完成工作的正则表达式。

/([0-9a-z-]{2,}\.[0-9a-z-]{2,3}\.[0-9a-z-]{2,3}|[0-9a-z-]{2,}\.[0-9a-z-]{2,3})$/i

它可能并不完美,但到目前为止我还没有遇到过失败的情况。

【问题讨论】:

    标签: regex


    【解决方案1】:

    这将匹配:

    ([0-9A-Za-z]{2,}\.[0-9A-Za-z]{2,3}\.[0-9A-Za-z]{2,3}|[0-9A-Za-z]{2,}\.[0-9A-Za-z]{2,3})$
    

    只要:

    1. 每行末尾没有多余的空格
    2. 使用的所有域代码都很短,只有两个或三个字母长。不适用于 .info 等长域代码。

    基本上它的作用是匹配这两个中的任何一个:

    1. 两个字母或更长的单词::两个或三个字母单词::两个或三个字母单词:行尾
    2. 两个字母或更长的单词::两个或三个字母单词:行尾

    短版:

    (\w{2,}\.\w{2,3}\.\w{2,3}|\w{2,}\.\w{2,3})$
    

    如果你希望它只匹配整行,那么在开头添加 ^

    这是我测试它的方式:

    【讨论】:

    • 这将失败,例如www.t.co
    • 这可能会通过一些更改来解决一个字母的大小写问题
    • 两部分的第一部分是否有一个只有一个字母的 TDL?
    • @tntu,我只是将正则表达式修改为不匹配单字母单词。再检查一遍。
    • 这是一个非常好的正则表达式,但它会匹配错误:ome.to.co.uk,无论如何,谢谢你它似乎可以容纳我到目前为止的所有案例
    【解决方案2】:

    如果你想要一个绝对正确的匹配器,正则表达式不是你要走的路。

    为什么?

    • 因为这两个都是有效域 + TLD:goo.glt.co

    • 因为它们都不是(它们只是 TLD):com.auco.uk

    您可能创建的任何能够正确处理上述所有情况的正则表达式都只是列出了有效的 TLD,这将破坏首先使用正则表达式的目的。

    相反,只需创建/获取当前 TLD 的列表并查看其中存在哪一个,然后在其前面添加第一个片段。

    【讨论】:

    • 这就是我迄今为止所做的,我不知道的新 TLD 失败了。示例:.nhs.uk
    • 针对有效域的数据库进行验证超出了问题的范围。正则表达式可以满足他的要求。
    • @user1598390 不,实际上,它不能 - 至少,如果不让该正则表达式成为有效 TLD 的数据库。
    • @tntu - 任何正确的正则表达式都会以类似的方式失败,因为两者都需要列出正确的有效 TLD。
    • 我更喜欢在一些非常不可预测的情况下可能会失败的正则表达式,然后列出所有已知的*域名并遇到新的
    【解决方案3】:

    这可能有任何用处。这将它们分成点符号。 那么拆分就很简单了。
    [^/:"]*\.[^/:"]*

    【讨论】: