Java regex для принятия правильного имени хоста, IPv4 или IPv6-адреса - PullRequest
6 голосов
/ 25 июня 2010

Кто-нибудь имеет хорошее (желательно проверенное) регулярное выражение для принятия только действительного имени хоста DNS, адреса IPv4 или IPv6?

Ответы [ 3 ]

19 голосов
/ 25 июня 2010

Я понимаю, что вас могут заставить использовать регулярное выражение. Однако, если возможно, лучше избегать использования регулярных выражений для этой задачи и использовать класс библиотеки Java для выполнения проверки.

Если вы хотите выполнить проверку и поиск DNS вместе, то InetAddress.getByName(String) - хороший выбор. Это позволит справиться с DNS, IPv4 и IPv6 за один раз и вернет вам аккуратно упакованный экземпляр InetAddress, который содержит как DNS-имя (если есть), так и IPv4 или IPv6-адрес.

Если вы просто хотите выполнить синтаксическую проверку, тогда в Apache commons есть пара классов, которые должны выполнить эту работу: DomainValidator и InetAddressValidator.

5 голосов
/ 25 июня 2010

У Guava новый класс HostSpecifier .Он даже проверит, что имя хоста (если это имя хоста) оканчивается действительным «общедоступным суффиксом» (например, «.com», «.co.uk» и т. Д.) На основе последнего общедоступного суффикса mozilla.список.Это то, что вы НЕ хотели бы попробовать с помощью созданного вручную регулярного выражения!

0 голосов
/ 08 августа 2014

Вдохновленный кодом, который я нашел в этом посте , я создал следующий метод валидатора, который, похоже, вполне подходит для простых проверок. Читая JavaDoc URI, я удалил некоторые ложные срабатывания, такие как «host: 80» и «hostname / page», но я не могу гарантировать, что остались некоторые ложные срабатывания.

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://userinfo@" + candidateHost + ":80").getHost() != null;
    } catch (URISyntaxException e) {
        return false;
    }
}
...