Регулярное выражение Java для принятия допустимого имени хоста, IPv4 или IPv6-адреса

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

3 ответов


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

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

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


гуава имеет новый класс HostSpecifier. Он даже подтвердит, что имя хоста (если это имя хоста) заканчивается допустимым "общедоступным суффиксом" (например,".com",".co.Великобритания " и др.), на основе последнего списка публичных суффиксов mozilla. Это то, что вы не хотели бы пытаться с помощью ручного regex!


вдохновленный кодом, который я нашел в этот пост, Я создал следующий метод валидатора, который, похоже,подходит для простой проверки, довольно хорошо. Прочитав 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;
    }
}