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