文字列が IP であるかホスト名であるかをどのように判断しますか

StackOverflow https://stackoverflow.com/questions/66923

  •  09-06-2019
  •  | 
  •  

質問

したがって、管理 Web UI から取得された文字列が存在します (したがって、これは間違いなく文字列です)。Java では、この文字列が IP アドレスであるかホスト名であるかをどのように確認できますか?

アップデート:私は自分の考えを明確にしていなかったと思います。Java SDK に IP とホスト名を区別するために使用できるものがあるかどうかを尋ねたかったのです。混乱を招いて申し訳ありません。時間を割いて答えてくれた/答えてくれた皆さんに感謝します。

役に立ちましたか?

解決

次のパターンで正規表現を使用できます。

\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.

それ以外の場合は、デフォルトのホスト名を使用できます。

URI validator = new URI(yourString);

このコードは IP アドレスまたはホスト名を検証します。(文字列が無効な場合は、不正な URI 例外がスローされます)

2 つを区別しようとしているのであれば、質問を読み損ねます。

正規表現と一致させることはできないでしょうか?

セキュリティマネージャーを使用できます。 InetAddress.getByName(addr) 電話。

addr がドット付きクワッドでない場合、 getByName 名前検索を行うために接続を実行しようとします。これは、セキュリティ管理者が名前としてキャプチャできます。 checkConnect(addr, -1) を呼び出すと、SecurityException がスローされ、これをキャッチできます。

使用できます System.setSecurityManager() カスタム セキュリティ マネージャーを挿入する完全な特権を持って実行している場合は、 getByName 電話がかかります。

これは見た目ほど単純ではなく、ハイフン、アンダースコア、角括弧「-」、「_」、「[]」などの文字の周りにはいくつかのあいまいさがあります。

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top