1. 概要

この短い記事では、Javaの特定のURLからドメイン名を取得するさまざまな方法を見ていきます。

2. ドメイン名とは何ですか?

簡単に言うと、ドメイン名はIPアドレスを指す文字列を表します。 これは、Uniform Resource Locator(URL)の一部です。 ドメイン名を使用すると、ユーザーはクライアントソフトウェアを介して特定のWebサイトにアクセスできます。

ドメイン名は通常、2つまたは3つの部分で構成され、それぞれがドットで区切られています。

ドメイン名には、最後から次のものが含まれる場合があります。

  • トップレベルドメイン(例:bealdung.comcom)、
  • セカンドレベルドメイン(例:google.co.ukcoまたはbaeldung.combaeldung)、
  • 第3レベルドメイン(例:google.co.ukgoogle

ドメイン名は、ドメインネームシステム(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);

ホストには、サブドメインと、第3、第2、およびトップレベルドメインが含まれます。 

さらに、ドメイン名を取得するには、指定されたホストからサブドメインを削除する必要があります。

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

ただし、URIクラスを使用してドメイン名を取得できない場合があります。 たとえば、正確な値がわからない場合、URLからサブドメインを取り出すことはできません。

4. GuavaライブラリのInternetDomainNameクラスを使用する

次に、GuavaライブラリとInternetDomainNameクラスを使用してドメイン名を取得する方法を説明します。

InternetDomainName クラスは、 topPrivateDomain()メソッドを提供します。このメソッドは、指定されたドメイン名のパブリックサフィックスの1レベル下の部分を返します。 つまり、このメソッドはトップレベル、第2レベル、および第3レベルのドメインを返します。

まず、指定された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から入手できます。