4

したがって、管理 Web UI から取得される文字列があります (つまり、文字列であることは間違いありません)。この文字列が IP アドレスなのか Java のホスト名なのかを調べるにはどうすればよいでしょうか?

更新:私は自分自身を明確にしていないと思います.IPとホスト名を区別するために使用できるJava SDKに何かあるかどうかをもっと尋ねていましたか? 混乱を招いて申し訳ありません。回答に時間を割いてくださった/これから回答してくださるすべての方々に感謝いたします。

4

9 に答える 9

15

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

\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アドレスかどうかがわかります。

于 2008-09-15T21:03:07.967 に答える
2

文字列が number.number.number.number 形式に一致するかどうかを確認できます。次に例を示します。

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

からのすべてに一致し0 - 999ます。

それ以外は、デフォルトでホスト名にすることができます。

于 2008-09-15T21:03:14.160 に答える
2

完全に異なるものではなく、どちらか一方であると仮定できますか? もしそうなら、おそらく正規表現を使用して、「ドット付きクワッド」形式に一致するかどうかを確認します。

于 2008-09-15T21:03:23.830 に答える
1

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

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
于 2016-10-19T15:14:18.840 に答える
1

呼び出しでセキュリティ マネージャを使用できますInetAddress.getByName(addr)

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

System.setSecurityManager()完全な特権で実行している場合は、getByName呼び出しが行われる前にカスタム セキュリティ マネージャーを挿入できます。

于 2008-09-15T21:27:08.000 に答える
1
URI validator = new URI(yourString);

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

あなたが2つを区別しようとしているなら..それから私はあなたの質問を読み逃します.

于 2008-09-15T21:09:12.180 に答える
0

それに正規表現をマッチさせることはできませんか?

于 2008-09-15T21:03:52.300 に答える
0

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
于 2019-08-22T15:03:11.527 に答える