用于接受有效主机名,IPv4或IPv6地址的Java正则表达式

任何人都有一个好的(最好是测试过的)正则表达式,只能使用有效的DNS主机名,IPv4或IPv6地址?

我知道你可能被迫使用正则表达式。 但是,如果可能,最好避免使用正则表达式执行此任务,并使用Java库类来进行validation。

如果要一起进行validation和DNS查找,那么InetAddress.getByName(String)是一个不错的选择。 这将一次性处理DNS,IPv4和IPv6,并返回一个包含DNS名称(如果提供)和IPv4或IPv6地址的整齐包装的InetAddress实例。

如果您只想进行语法validation,那么Apache commons有几个应该完成这项工作的类: DomainValidatorInetAddressValidator

Guava有一个新类HostSpecifier 。 它甚至会validation主机名(如果它是主机名)以有效的“公共后缀”(例如“.com”,“。co.uk”等)结尾,基于最新的mozilla公共后缀名单。 这是你不想用手工制作的正则表达式尝试的东西!

受到我在这篇文章中找到的代码的启发,我创建了以下validation器方法,似乎非常适合简单的validation需求。 通过读取URI的JavaDoc,我删除了一些误报,例如“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; } }