Это не так просто, как может показаться, существуют некоторые двусмысленности вокруг символов, таких как дефисы, подчеркивания и квадратные скобки '-', '_', '[]'.
В Java SDK есть некоторые ограничения в этой области. При использовании InetAddress.getByName он выйдет в сеть, чтобы выполнить разрешение имен DNS и разрешить адрес, который является дорогостоящим и ненужным, если все, что вы хотите, - это определить адрес хоста и адреса. Кроме того, если адрес написан в немного отличающемся, но действительном формате (распространенном в IPv6), то сравнение строк по результатам InetAddress.getByName не будет работать.
The IPAddress Java library будет делать это. 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
Я думаю, что только тестирование для значного модели более чем достаточно, если вам нужно подтверждение реального диапазона, регулярное выражение действительно не лучший способ сделать это. – DevelopingChris 2008-09-16 15:09:15