2008-09-15 8 views
4

Sie haben also einen String, der von einer Admin-Web-UI abgerufen wird (also definitiv ein String). Wie können Sie herausfinden, ob diese Zeichenfolge eine IP-Adresse oder ein Hostname in Java ist?Wie erkennen Sie, ob ein String eine IP oder ein Hostname ist?

Update: Ich denke, ich habe mich nicht klar gemacht, ich fragte mehr, ob es etwas im Java SDK gibt, mit dem ich zwischen IPs und Hostnamen unterscheiden kann? Entschuldigung für die Verwirrung und danke für alle, die sich die Zeit genommen haben, dies zu beantworten.

Antwort

14

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 

, die Ihnen sagen, ob es eine IPv4-Adresse ist.

+0

Ich denke nur, für die Ziffer Muster testen, mehr als genug, wenn Sie echten Bereich Validierung benötigen, regex ist wirklich nicht der beste Weg, es zu tun. – DevelopingChris

2

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

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

alles von 0 - 999 übereinstimmen.

Alles andere können Sie standardmäßig Hostnamen haben.

+0

999.999.999.999 ist kein gültiges IP-Format. Ihre Regex muss spezifischer sein – Vagnerr

+4

denke nicht, es ist auch ein gültiger Host-Name – DevelopingChris

2

Erhalten wir die Annahme, dass es ist der eine oder andere, und nicht etwas völlig anderes? Wenn ja, würde ich wahrscheinlich eine Regex verwenden, um zu sehen, ob sie dem "gepunkteten Quad" -Format entspricht.

0

Könntest du nicht einfach zu einem Regexp passen?

1
URI validator = new URI(yourString); 

Dieser Code überprüft die IP-Adresse oder den Hostnamen. (Es wird eine ungültige URI Exception ausgelöst, wenn die Zeichenfolge ungültig ist)

Wenn Sie versuchen, die beiden zu unterscheiden..dann vermisse ich Ihre Frage zu lesen.

0

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

Wenn die Adresse kein gepunkteter Quad ist, versucht getByName eine Verbindung durchzuführen, um die Namenssuche durchzuführen, die der Sicherheitsmanager als checkConnect(addr, -1)-Aufruf erfassen kann, was zu einer ausgelösten SecurityException führt, die Sie abfangen können.

Sie können System.setSecurityManager() verwenden, wenn Sie vollständig privilegiert sind, Ihren benutzerdefinierten Sicherheitsmanager einzufügen, bevor der getByName-Aufruf erfolgt.

0

Es ist nicht so einfach wie es erscheinen mag, es gibt einige Unklarheiten um Zeichen wie Bindestriche, Unterstriche und eckige Klammern '-', '_', '[]'.

Das Java SDK hat in diesem Bereich einige Einschränkungen. Wenn Sie InetAddress.getByName verwenden, wird es in das Netzwerk gehen, um eine DNS-Namensauflösung durchzuführen und die Adresse aufzulösen, was teuer und unnötig ist, wenn Sie nur Host gegen Adresse erkennen wollen. Wenn eine Adresse in einem etwas anderen, aber gültigen Format (in IPv6 üblich) geschrieben wird, funktioniert ein String-Vergleich der Ergebnisse von InetAddress.getByName nicht.

The IPAddress Java library wird es tun. Das Javadoc ist unter dem Link verfügbar. Disclaimer: Ich bin der Projektleiter.

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

Ausgang:

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