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
クラスを用いることをお勧めします。