1. 概述

在这篇短文中,我们将探讨在Java中从给定URL获取域名的不同方法。

2. 什么是域名?

简单来说,域名代表指向IP地址的字符串,它是统一资源定位符(URL)的一部分。通过域名,用户可以通过客户端软件访问特定的网站。

域名通常由两到三个部分组成,每个部分之间用点分隔。

从尾部开始,域名可能包括:

  • **顶级域名(如:combealdung.com 中),
  • **二级域名(如:cogoogle.co.ukbaeldungbaeldung.com 中),
  • 三级域名(如:googlegoogle.co.uk 中)

域名需要遵循域名系统(DNS)规定的规则和流程。

3. 使用URI类

让我们看看如何使用java.net.URI类从URL中提取域名。URI类提供了getHost()方法,它返回URL的主机部分:

URI uri = new URI("https://www.baeldung.com/domain");
String host = uri.getHost();
assertEquals("www.baeldung.com", host);

主机包含子域以及三级、二级和顶级域名。

此外,为了获取域名,我们需要从给定的主机中移除子域:

String domainName = host.startsWith("www.") ? host.substring(4) : host;
assertEquals("baeldung.com", domainName);

然而,在某些情况下,我们不能使用URI类获取域名。例如,如果我们不知道子域的确切值,就无法从中取出。

4. 使用Guava库的InternetDomainName类

现在,我们将看到如何使用Guava库和InternetDomainName类来获取域名。

InternetDomainName类提供了topPrivateDomain()方法,它返回给定域名中公共后缀下一级的部分。换句话说,这个方法将返回顶级、二级和三级域名。

首先,我们需要从给定的URL值中提取主机。我们可以使用URI类:

String urlString = "https://www.baeldung.com/java-tutorial";
URI uri = new URI(urlString);
String host = uri.getHost();

接下来,使用InternetDomainName类及其topPrivateDomain()方法获取域名:

InternetDomainName internetDomainName = InternetDomainName.from(host).topPrivateDomain(); 
String domainName = internetDomainName.toString(); 
assertEquals("baeldung.com", domainName);

URI类相比,InternetDomainName会在返回的值中省略子域。

最后,我们还可以从给定的URL中移除顶级域名:

String publicSuffix = internetDomainName.publicSuffix().toString();
String name = domainName.substring(0, domainName.lastIndexOf("." + publicSuffix));

此外,让我们创建一个测试来检查功能:

assertEquals("baeldung", domainNameClient.getName("jira.baeldung.com"));
assertEquals("google", domainNameClient.getName("www.google.co.uk"));

我们可以看到,子域和顶级域名都被从结果中移除了。

5. 使用正则表达式

使用正则表达式获取域名可能会有挑战性。例如,如果我们不知道子域的确切值,就无法确定应该从给定URL中提取哪个单词(如果有)。

另一方面,如果我们知道子域值,我们可以使用正则表达式从URL中移除它:

String url = "https://www.baeldung.com/domain";
String domainName =  url.replaceAll("http(s)?://|www\\.|/.*", "");
assertEquals("baeldung.com", domainName);

6. 总结

在这篇文章中,我们探讨了如何从给定URL中提取域名。如往常一样,示例代码可以在GitHub上找到


» 下一篇: Java Weekly, 第439期