Как определить, является ли строка IP-адресом или именем хоста? - PullRequest
4 голосов
/ 16 сентября 2008

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

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

Ответы [ 7 ]

14 голосов
/ 16 сентября 2008

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

\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-адрес.

2 голосов
/ 16 сентября 2008

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

2 голосов
/ 16 сентября 2008

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

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

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

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

1 голос
/ 16 сентября 2008
URI validator = new URI(yourString);

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

Если вы пытаетесь провести различие между двумя ... тогда я скучаю, прочитайте ваш вопрос.

0 голосов
/ 19 октября 2016

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

Java SDK имеет некоторые ограничения в этой области. При использовании InetAddress.getByName он будет выходить в сеть, чтобы выполнить разрешение имен DNS и разрешить адрес, что является дорогостоящим и ненужным, если все, что вам нужно, это определить адрес хоста против адреса. Кроме того, если адрес записан в несколько ином, но допустимом формате (обычно в IPv6), сравнение строк с результатами InetAddress.getByName не будет работать.

Java-библиотека IPAddress сделает это. 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
0 голосов
/ 16 сентября 2008

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

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

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

0 голосов
/ 16 сентября 2008

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

...