正则表达式匹配主域名

6
我需要能够识别任何子域名的域名。
例如:
对于所有这些,我只需要匹配 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

我整天都在玩正则表达式,也一直在谷歌上搜寻资料,但还是找不到合适的。编辑2:我更喜欢一个可能会因为像t.co这样非常奇怪的情况而失败的正则表达式,然后列出所有TLD并使我没有列出但可以预测的TLD失败,并使其匹配更多内容。这不是你会选择的选项吗?更新:根据所选答案的指导,我构建了这个正则表达式,可以完成我的工作。它可能不完美,但到目前为止我还没有遇到过它失败的情况。
3个回答

7

这将匹配:

([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})$

如果您希望它仅匹配整行,则在开头添加^。
这是我测试的方法: enter image description here

第一个部分中是否有只有一个字母的TDL? - transilvlad
@tntu,我刚刚修改了正则表达式,不匹配单个字母的单词。请再次检查。 - Tulains Córdova
这是非常好的正则表达式,但它会匹配到错误的结果,比如"ome.to.co.uk"。不管怎样,感谢您,目前看来它似乎符合我所有的情况。 - transilvlad
国际化域名将会失败。例如:кто.рф,北京大学.cn。 - Slava
它与rufus.akeo.ie不匹配。 - amuliar
显示剩余3条评论

5
如果你想要一个绝对正确的匹配器,正则表达式并不是最佳选择。
为什么呢?
因为这两个都是有效的域名 + 顶级域名:goo.gl、t.co。
因为这两个只是顶级域名而不是域名:com.au、co.uk。
任何你可能创建的正则表达式,如果要处理以上所有情况,就需要列出所有有效的顶级域名,这将打败使用正则表达式的初衷。
相反,只需创建/获取当前顶级域名列表,并查看其中哪一个存在,然后添加它前面的第一个段落即可。

3
不,实际上不能 - 至少不是在将那个正则表达式变成有效顶级域名数据库之前。 - Amber
@Amber,他/她不想检查域名的正确性。他/她只是想从文本样例中提取类似于域名的模式。 - Tulains Córdova
@Amber我知道正则表达式或代码选项中的任何一个在某些情况下都会失败,但是正则表达式可以被设计来适应大多数情况,不是吗?我更喜欢匹配完整地址而不是没有匹配。 - transilvlad
TLD仍然有效。我不知道你为什么认为它们无效。有一段时间,to域正在运行一个URL缩短服务:http://to./,您只需要将其设置为FQDN即可到达。 - OmnipotentEntity
@Amber提出了一个非常有价值的观点。创建和维护一个可以捕获所有可能性的正则表达式将会非常困难。如何继续取决于您需要它做什么。您可以通过不允许无效字符、要求至少一个点、不允许--(除了在^xn--之后)来捕获大多数问题。对于完整的验证,使用数据库可能是最好的选择。尝试这个 - fazy
显示剩余6条评论

0
这可能有用。这将它们分成了点记号。 然后只需简单地拆分即可。
[^/:"]*\.[^/:"]*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接