Wie erkennt man, ob es sich bei einer Zeichenfolge um eine IP oder einen Hostnamen handelt?

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

  •  09-06-2019
  •  | 
  •  

Frage

Sie haben also einen String, der von einer Admin-Web-Benutzeroberfläche abgerufen wird (es handelt sich also definitiv um einen String).Wie können Sie in Java herausfinden, ob es sich bei dieser Zeichenfolge um eine IP-Adresse oder einen Hostnamen handelt?

Aktualisieren:Ich glaube, ich habe mich nicht klar ausgedrückt, ich habe eher gefragt, ob es im Java SDK etwas gibt, mit dem ich zwischen IPs und Hostnamen unterscheiden kann?Entschuldigung für die Verwirrung und vielen Dank an alle, die sich die Zeit genommen haben/nehmen werden, diese Frage zu beantworten.

War es hilfreich?

Lösung

Sie können einen regulären Ausdruck mit diesem Muster verwenden:

\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

Das wird Ihnen sagen, ob es eine IPv4-Adresse ist.

Andere Tipps

Sie bekommen wir davon ausgehen, dass es ist eine oder das andere, und nicht etwas ganz anderes? Wenn ja, würde ich wahrscheinlich einen regulären Ausdruck verwenden, um festzustellen, ob es das „Dotted Quad“ Format angepasst.

Sie können sehen, ob die Zeichenfolge mit dem number.number.number.number Format entsprechen, zum Beispiel:

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

wird alles von 0 - 999 entsprechen.

Alles was Sie sonst kann es zu Hostnamen haben Standard.

URI validator = new URI(yourString);

Dieser Code wird die IP-Adresse oder den Hostnamen überprüfen. (Es wirft eine ungültige URI Ausnahme, wenn die Zeichenfolge ungültig ist)

Wenn Sie versuchen, die two..then Ich lese Ihre Frage vermissen zu unterscheiden.

Könnten Sie nicht nur zu einem regexp Spiel auf sie?

Sie können einen Sicherheitsmanager mit dem verwenden InetAddress.getByName(addr) Anruf.

Wenn die Adresse kein gepunktetes Viereck ist, getByName wird versuchen, eine Verbindung herzustellen, um die Namenssuche durchzuführen, die der Sicherheitsmanager als erfassen kann checkConnect(addr, -1) aufrufen, was zu einer ausgelösten SecurityException führt, die Sie abfangen können.

Sie können verwenden System.setSecurityManager() Wenn Sie vollständig privilegiert sind, können Sie Ihren benutzerdefinierten Sicherheitsmanager vor dem einfügen getByName Anruf erfolgt.

Es ist nicht so einfach, wie es scheinen mag, gibt es einige Unklarheiten um Zeichen wie Bindestriche, zu unterstreichen, und eckige Klammern ‚-‘, ‚_‘, ‚[]‘

.

Der Java-SDK ist hat einige Einschränkungen in diesem Bereich. Wenn InetAddress.getByName verwendet, wird es auf das Netzwerk gehen, um eine DNS-Namensauflösung zu tun und die Adresse aufzulösen, was teuer und nicht notwendig ist, wenn alles, was Sie wollen, ist Host-vs-Adresse zu ermitteln. Auch, wenn eine Adresse in einem etwas anderen, aber gültigen Format (Common in IPv6) machen einen String-Vergleich zu den Ergebnissen der InetAddress.getByName geschrieben wird nicht funktionieren.

IPAddress Java-Bibliothek es tun wird. Die javadoc ist unter dem Link zur Verfügung. Disclaimer: Ich bin der Projektmanager

.
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);  
}

Ausgabe:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top