所以你有一个从管理Web UI检索的字符串(所以它肯定是一个字符串)。你怎么知道这个字符串是Java中的IP地址还是主机名?你如何判断一个字符串是IP还是主机名
更新:我觉得我没有说清楚,我更关心的是,在Java SDK中是否有任何东西可以用来区分IP和主机名?对不起,我感到困惑,并感谢所有花时间回答这个问题的人。
所以你有一个从管理Web UI检索的字符串(所以它肯定是一个字符串)。你怎么知道这个字符串是Java中的IP地址还是主机名?你如何判断一个字符串是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
匹配任何内容。
其他任何你可以让它默认为主机名。
999.999.999.999不是有效的ip格式。你的正则表达式需要更具体的 – Vagnerr 2008-09-15 21:06:17
我们是否可以假设它是其中之一,而不是完全不同的东西?如果是这样,我可能会使用正则表达式来查看它是否符合“虚线四格”格式。
难道你不能只是一个正则表达式匹配吗?
URI validator = new URI(yourString);
该代码将验证IP地址或主机名。 (如果字符串无效,则会引发格式错误的URI异常)
如果您试图区分这两种情况,那么我错过了阅读您的问题。
您可以使用安全管理器和InetAddress.getByName(addr)
调用。
如果地址不是虚线四位,getByName
将尝试执行连接以执行名称查找,安全管理器可以将其捕获为checkConnect(addr, -1)
调用,从而导致抛出一个抛出的SecurityException。
如果您完全有权在调用getByName
之前插入自定义安全管理器,则可以使用System.setSecurityManager()
。
它不像它看起来那么简单,围绕字符如连字符,下划线和方括号' - ','_','[]'有一些含糊之处。
Java SDK在这方面有一些限制。当使用InetAddress.getByName时,它将出现在网络上以执行DNS名称解析并解析地址,如果您只想检测主机VS地址,则地址是昂贵且不必要的。另外,如果地址是以略微不同但有效的格式(通用于IPv6)编写的,对InetAddress.getByName的结果进行字符串比较将不起作用。
The IPAddress Java library将做到这一点。 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
我认为只是测试的数字模式是绰绰有余,如果你需要真正的范围验证,正则表达式是真的不做到这一点的最好办法。 – DevelopingChris 2008-09-16 15:09:15