Регулярное выражение 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;
}
}