したがって、管理 Web UI から取得される文字列があります (つまり、文字列であることは間違いありません)。この文字列が IP アドレスなのか Java のホスト名なのかを調べるにはどうすればよいでしょうか?
更新:私は自分自身を明確にしていないと思います.IPとホスト名を区別するために使用できるJava SDKに何かあるかどうかをもっと尋ねていましたか? 混乱を招いて申し訳ありません。回答に時間を割いてくださった/これから回答してくださるすべての方々に感謝いたします。
したがって、管理 Web UI から取得される文字列があります (つまり、文字列であることは間違いありません)。この文字列が IP アドレスなのか Java のホスト名なのかを調べるにはどうすればよいでしょうか?
更新:私は自分自身を明確にしていないと思います.IPとホスト名を区別するために使用できるJava SDKに何かあるかどうかをもっと尋ねていましたか? 混乱を招いて申し訳ありません。回答に時間を割いてくださった/これから回答してくださるすべての方々に感謝いたします。
このパターンで正規表現を使用できます。
\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
それがIPv4アドレスかどうかがわかります。
文字列が number.number.number.number 形式に一致するかどうかを確認できます。次に例を示します。
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
からのすべてに一致し0 - 999
ます。
それ以外は、デフォルトでホスト名にすることができます。
完全に異なるものではなく、どちらか一方であると仮定できますか? もしそうなら、おそらく正規表現を使用して、「ドット付きクワッド」形式に一致するかどうかを確認します。
見た目ほど単純ではありません。ハイフン、アンダースコア、角括弧 '-'、'_'、'[]' などの文字の周りにはいくつかのあいまいさがあります。
Java SDK には、この領域でいくつかの制限があります。InetAddress.getByName を使用すると、ネットワークに出て DNS の名前解決を行い、アドレスを解決します。これは、ホストとアドレスを検出することだけが必要な場合、高価で不要です。また、アドレスがわずかに異なるが有効な形式 (IPv6 で一般的) で記述されている場合、InetAddress.getByName の結果で文字列比較を行うことは機能しません。
IPAddress Java ライブラリがそれを行います。javadoc はリンクから入手できます。免責事項: 私はプロジェクト マネージャーです。
static void check(HostName host) {
try {
host.validate();
if(host.isAddress()) {
System.out.println("address: " + host.asAddress());
} else {
System.out.println("host name: " + host);
}
} catch(HostNameException e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] args) {
HostName host = new HostName("1.2.3.4");
check(host);
host = new HostName("1.2.a.4");
check(host);
host = new HostName("::1");
check(host);
host = new HostName("[::1]");
check(host);
host = new HostName("1.2.?.4");
check(host);
}
出力:
address: 1.2.3.4
host name: 1.2.a.4
address: ::1
address: ::1
1.2.?.4 Host error: invalid character at index 4
呼び出しでセキュリティ マネージャを使用できますInetAddress.getByName(addr)
。
addr がドット付きクワッドでない場合、 はgetByName
接続を実行して名前検索を実行しようとします。これは、セキュリティ マネージャーがcheckConnect(addr, -1)
呼び出しとしてキャプチャできるため、キャッチできる SecurityException がスローされます。
System.setSecurityManager()
完全な特権で実行している場合は、getByName
呼び出しが行われる前にカスタム セキュリティ マネージャーを挿入できます。
URI validator = new URI(yourString);
そのコードは、IP アドレスまたはホスト名を検証します。(文字列が無効な場合、不正な形式の URI 例外をスローします)
あなたが2つを区別しようとしているなら..それから私はあなたの質問を読み逃します.
それに正規表現をマッチさせることはできませんか?
InetAddress#getAllByName(String hostOrIp)を使用します-hostOrIp
が IP アドレスの場合、結果は単一の InetAddress を持つ配列であり.getHostAddress()
、 と同じ文字列を返しますhostOrIp
。
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
public class IPvsHostTest {
private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(IPvsHostTest.class);
@org.junit.Test
public void checkHostValidity() {
Arrays.asList("10.10.10.10", "google.com").forEach( hostname -> isHost(hostname));
}
private void isHost(String ip){
try {
InetAddress[] ips = InetAddress.getAllByName(ip);
LOG.info("IP-addresses for {}", ip);
Arrays.asList(ips).forEach( ia -> {
LOG.info(ia.getHostAddress());
});
} catch (UnknownHostException e) {
LOG.error("Invalid hostname", e);
}
}
}
出力:
IP-addresses for 10.10.10.10
10.10.10.10
IP-addresses for google.com
64.233.164.100
64.233.164.138
64.233.164.139
64.233.164.113
64.233.164.102
64.233.164.101