2010-06-24 4 views

Antwort

18

Ich verstehe, dass Sie forciert eine Regex verwenden können. Wenn es jedoch möglich ist, sollten Sie die Verwendung von Regexes für diese Aufgabe vermeiden und stattdessen eine Java-Bibliotheksklasse für die Validierung verwenden.

Wenn Sie Validierung und DNS-Lookup zusammen durchführen möchten, dann ist InetAddress.getByName(String) eine gute Wahl. Dies erledigt DNS, IPv4 und IPv6 in einem Schritt und gibt Ihnen eine ordentlich verpackte InetAddress Instanz zurück, die sowohl den DNS-Namen (falls vorhanden) als auch die IPv4- oder IPv6-Adresse enthält.

Wenn Sie nur eine syntaktische Validierung durchführen möchten, dann Apache commons hat ein paar Klassen, die den Job tun sollten: DomainValidator und InetAddressValidator.

+0

Danke, diese Apache Klassen sollten den Trick machen! – ljbade

+0

Leider wird nur eine Ausnahme ausgelöst, weil ein Host nicht existiert, nicht nur wenn der Host ungültig ist. – Trejkaz

+0

@Trejkaz - über was "redest du? Hast du den alternativen Ansatz auch versucht? –

5

Guava hat eine neue Klasse HostSpecifier. Es wird sogar validiert, dass der Host-Name (wenn es ein Host-Name ist) mit einem gültigen "öffentlichen Suffix" endet (zB ".com", ".co.uk" usw.), basierend auf dem neuesten mozilla public-Suffix Liste. Das ist etwas, was Sie NICHT mit einer handgefertigten Regex versuchen möchten!

+0

Ich möchte nicht Code vertrauen, der eine Momentaufnahme der "neuesten" öffentlichen Suffix-Liste entweder gemacht hat, denn ein paar Monate später wird es nicht der neueste sein. – Trejkaz

0

Inspiriert von dem Code, den ich in this post gefunden habe, habe ich die folgende Validator-Methode erstellt, die ganz einfach zur einfachen Validierung passt. Durch das Lesen des JavaDoc von URI habe ich einige falsche Positive wie "Host: 80" und "Hostname/Seite" entfernt, aber ich kann nicht garantieren, dass noch einige falsche Positive übrig sind.

public static boolean isValidHostNameSyntax(String candidateHost) { 
    if (candidateHost.contains("/")) { 
     return false; 
    } 
    try { 
     // WORKAROUND: add any scheme and port to make the resulting URI valid 
     return new URI("my://[email protected]" + candidateHost + ":80").getHost() != null; 
    } catch (URISyntaxException e) { 
     return false; 
    } 
} 
Verwandte Themen