5

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

例子:

对于所有这些,我只需要匹配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 并列出我没有列出但可能被预测失败并匹配更多的那些。这不是你会选择的选项吗?

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

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

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

4

3 回答 3

6

这将匹配:

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

如果您希望它只匹配整行,请在开头添加 ^

这就是我测试它的方式:

在此处输入图像描述

于 2012-10-07T20:12:38.393 回答
5

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

为什么?

  • 因为这两个都是有效的域 + TLD:goo.gl, t.co.

  • 因为这些都不是(它们只是 TLD):com.au, co.uk.

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

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

于 2012-10-07T20:11:59.733 回答
0

这可能有任何用处。这将它们分成点符号。然后,拆分它是一个简单的问题。
[^/:"]*\.[^/:"]*

于 2015-12-15T20:37:06.913 回答