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

时间:2010-06-24 23:17:53

标签: java regex ipv6 hostname ipv4

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

4 个答案:

答案 0 :(得分:19)

我了解您可能强制使用正则表达式。但是,如果可能,最好避免使用正则表达式执行此任务,并使用Java库类来进行验证。

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:0)

受到我在this post中找到的代码的启发,我创建了以下验证方法,它似乎非常适合简单的验证需求。通过读取URI的JavaDoc,我删除了一些误报,例如" host:80"和"主机名/页面",但我不能保证还有一些误报。

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;
    }
}

答案 3 :(得分:0)

你也可以这样做。让我们说:

public boolean isHostnameValid(String hostname) {
    try {
        InetAddress.getAllByName(hostname); // throws an error when the hostnme could not be found, if so, then return false
        return true;
    } catch(Exception exc) {
        return false;
    }
}