2008-09-15 2 views
4

Итак, у вас есть строка, которая извлекается из пользовательского интерфейса администратора (так что это определенно строка). Как узнать, является ли эта строка IP-адресом или именем хоста в Java?Как вы определяете, является ли строка IP или именем хоста

Обновление: Я думаю, что я не прояснил себя, я больше спрашивал, есть ли что-нибудь в Java SDK, которое я могу использовать для различения IP-адресов и имен хостов? Извините за путаницу и спасибо всем, кто взял/будет тратить время, чтобы ответить на это.

ответ

14

Вы можете использовать регулярное выражение с этим рисунком:

\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 

Это скажет вам, если это адрес IPv4.

+0

Я думаю, что только тестирование для значного модели более чем достаточно, если вам нужно подтверждение реального диапазона, регулярное выражение действительно не лучший способ сделать это. – DevelopingChris 2008-09-16 15:09:15

2

Вы можете увидеть, если строка соответствует формату number.number.number.number, например:

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

будет соответствовать что-нибудь из 0 - 999.

Все, что вы можете иметь по умолчанию для имени хоста.

+0

999.999.999.999 не является допустимым ip-форматом. ваше регулярное выражение должно быть более конкретным – Vagnerr 2008-09-15 21:06:17

2

Есть ли у нас предположение, что это является того или иного, а не совсем другого? Если это так, я бы, вероятно, использовал регулярное выражение, чтобы увидеть, соответствует ли он формату «пунктирный квадрат».

0

Не могли бы вы просто повторить регулярное выражение?

1
URI validator = new URI(yourString); 

Этот код будет проверять IP-адрес или имя хоста. (Он выбрасывает неправильное URI-исключение, если строка недействительна)

Если вы пытаетесь отличить эти два ... то я пропущу ваш вопрос.

0

Вы можете использовать менеджера безопасности с вызовом InetAddress.getByName(addr).

Если addr не является точечным квадратом, getByName попытается выполнить соединение, чтобы выполнить поиск по имени, который менеджер безопасности может захватить как вызов checkConnect(addr, -1), в результате чего возникло исключение SecurityException, которое вы можете поймать.

Вы можете использовать System.setSecurityManager(), если вы используете полностью привилегированное вложение своего настраиваемого менеджера безопасности до того, как будет сделан вызов getByName.

0

Это не так просто, как может показаться, существуют некоторые двусмысленности вокруг символов, таких как дефисы, подчеркивания и квадратные скобки '-', '_', '[]'.

В 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 
Смежные вопросы