因此,您有一个从管理 Web UI 检索的字符串(因此它绝对是一个字符串)。在 Java 中如何判断该字符串是 IP 地址还是主机名?

更新:我想我没有说清楚,我更多的是问Java SDK中是否有任何东西可以用来区分IP和主机名?很抱歉给您带来困惑,并感谢所有花时间/将花时间回答这个问题的人。

有帮助吗?

解决方案

您可以使用具有以下模式的正则表达式:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

这会告诉您它是否是 IPv4 地址。

其他提示

我们是否可以假设 两者之一,而不是完全不同的东西?如果是这样,我可能会使用正则表达式来查看它是否与“点四边形”格式匹配。

您可以查看字符串是否符合 number.number.number.number 格式,例如:

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

将匹配任何来自 0 - 999.

其他任何内容都可以默认为主机名。

URI validator = new URI(yourString);

该代码将验证 IP 地址或主机名。(如果字符串无效,则会抛出格式错误的 URI 异常)

如果您想区分两者……那么我想念您的问题。

你不能直接对其进行正则表达式匹配吗?

您可以使用安全管理器 InetAddress.getByName(addr) 称呼。

如果 addr 不是点分四边形, getByName 将尝试执行连接以进行名称查找,安全管理器可以将其捕获为 checkConnect(addr, -1) 调用,导致抛出一个您可以捕获的 SecurityException。

您可以使用 System.setSecurityManager() 如果您正在运行完全特权,可以在之前插入您的自定义安全管理器 getByName 已拨打电话。

它并不像看起来那么简单,连字符、下划线和方括号“-”、“_”、“[]”等字符存在一些歧义。

Java SDK 在这方面有一些限制。当使用 InetAddress.getByName 时,它​​将进入网络进行 DNS 名称解析并解析地址,如果您只想检测主机与地址,那么这是昂贵且不必要的。此外,如果地址以稍微不同但有效的格式(在 IPv6 中常见)写入,则对 InetAddress.getByName 的结果进行字符串比较将不起作用。

IP 地址 Java 库 会做的。javadoc 可在链接中找到。免责声明:我是项目经理。

static void check(HostName host) {
    try {
        host.validate();
        if(host.isAddress()) {
            System.out.println("address: " + host.asAddress());
        } else {
            System.out.println("host name: " + host);
        }
    } catch(HostNameException e) {
        System.out.println(e.getMessage());
    }
}

public static void main(String[] args) {
    HostName host = new HostName("1.2.3.4");
    check(host);
    host = new HostName("1.2.a.4");
    check(host);
    host = new HostName("::1");
    check(host);
    host = new HostName("[::1]");
    check(host);
    host = new HostName("1.2.?.4");
    check(host);  
}

输出:

address: 1.2.3.4
host name: 1.2.a.4
address: ::1
address: ::1
1.2.?.4 Host error: invalid character at index 4
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top