2008-09-15 123 views
4

所以你有一个从管理Web UI检索的字符串(所以它肯定是一个字符串)。你怎么知道这个字符串是Java中的IP地址还是主机名?你如何判断一个字符串是IP还是主机名

更新:我觉得我没有说清楚,我更关心的是,在Java SDK中是否有任何东西可以用来区分IP和主机名?对不起,我感到困惑,并感谢所有花时间回答这个问题的人。

回答

14

您可以使用正则表达式使用此模式:

\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地址。

+0

我认为只是测试的数字模式是绰绰有余,如果你需要真正的范围验证,正则表达式是真的不做到这一点的最好办法。 – DevelopingChris 2008-09-16 15:09:15

2

你可以看到,如果字符串number.number.number.number格式相匹配,例如:

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

将从0 - 999匹配任何内容。

其他任何你可以让它默认为主机名。

+0

999.999.999.999不是有效的ip格式。你的正则表达式需要更具体的 – Vagnerr 2008-09-15 21:06:17

2

我们是否可以假设它其中之一,而不是完全不同的东西?如果是这样,我可能会使用正则表达式来查看它是否符合“虚线四格”格式。

0

难道你不能只是一个正则表达式匹配吗?

1
URI validator = new URI(yourString); 

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

如果您试图区分这两种情况,那么我错过了阅读您的问题。

0

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

如果地址不是虚线四位,getByName将尝试执行连接以执行名称查找,安全管理器可以将其捕获为checkConnect(addr, -1)调用,从而导致抛出一个抛出的SecurityException。

如果您完全有权在调用getByName之前插入自定义安全管理器,则可以使用System.setSecurityManager()

0

它不像它看起来那么简单,围绕字符如连字符,下划线和方括号' - ','_','[]'有一些含糊之处。

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 
相关问题