TL;DR
URI.getRawAuthorityが良さげに見えました。
やり方
やり方はいくつか考えられますが、ここではjava.net.URI.getRawAuthorityを使ったやり方を紹介します。
サンプルコード
import java.net.URI;
import java.util.stream.Stream;
Stream.of(
new URI("url"),
new URI("url.com"),
new URI("./url/foo"),
new URI("http://url"),
new URI("http://url.com/"),
new URI("http://aa.bb.cc.com/foo/bar"),
new URI("https://あ.い")
).forEach(it -> System.out.println(it.getRawAuthority()));
実行結果
null
null
null
url
url.com
aa.bb.cc.com
あ.い
解説
サンプルコードからは以下のことが確認できます。
- 入力フォーマットは、
http(s)://を頭につければ後ろがFQDN形式になっていなくてもOK- 相対パスを渡した際は
nullになる
- 相対パスを渡した際は
- 日本語(多バイト文字)が入っていても動作する
- ドメイン末尾の
/やパスは削除される
変なものを入れるとnullを返されてしまったり、URISyntaxExceptionを投げられることが有る点には注意が必要です。
また、getAuthorityではなくgetRawAuthorityを用いている理由は、エスケープされた入力が意図せずデコードされるようなことを回避するためです。
URIからドメインを取得する方法は他にも有りますが、自分の要件ではこのやり方で十分動作したため、ここでは解説しません。
より詳細な解説は下記のJavadocを参照ください。
また、URLクラスはあまり良くないそうなので、必ずURIクラスを用いることをお勧めします。