繁体   English   中英

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

[英]Java regex for accepting a valid hostname,IPv4, or IPv6 address

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

我了解您可能被迫使用正则表达式。 但是,如果可能,最好避免在此任务中使用正则表达式,而是使用 Java 库类来进行验证。

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

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

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

正如其他人所说,使用正则表达式执行此操作是一项相当大的挑战,不可取。 但是使用IPAddress Java 库很容易做到,它可以解析主机名、IPv4 和 IPv6 地址,而不会触发 DNS 查找。 免责声明:我是那个图书馆的项目经理。

示例代码:

check("1.2.3.4");
check("::1");
check("a.b.com");

static void check(String hostStr) {
    HostName host = new HostName(hostStr);
    try {
        host.validate(); // triggers exception for invalid
        if(host.isAddress()) {
            IPAddress address = host.asAddress();
            System.out.println(address.getIPVersion() + " address: " + address);
        } else {
            System.out.println("host name: " + host);
        }
    } catch(HostNameException e) {
        System.out.println(e.getMessage());
    }
}

输出:

IPv4 address: 1.2.3.4
IPv6 address: ::1
host name: a.b.com

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM