2011-03-03 105 views
0

假设一个包含IP(v4或v6)主机名的java字符串。
在这些情况下检测的最佳方法是什么?
我对IP是否处于有效范围(例如IPv4的999.999.999.999)没有太多兴趣。
我感兴趣的只是一种检测字符串是主机名还是IP(v4或v6)的方法。
起初我以为这样的:java的字符串检测ip

if(theString.indexOf("@")!=-1){ 
//Not an Ip 
} 

,但我不知道我是否应该总是指望含@始终的格式。

感谢

+0

您正在寻找主机名中的'@'?我发布了一个答案,但我不确定你为什么关注那个角色。 – 2011-03-03 07:23:03

+0

是不是somename @ domainName是一个有效的主机名? – Cratylus 2011-03-03 07:33:22

+0

这可能是一个电子邮件地址。主机名是指在DNS中查询时可能会以某种方式解决的名称。在这里看到更多:http://en.wikipedia.org/wiki/Hostname – 2011-03-03 08:39:04

回答

2

一套简单与Pattern class正则表达式将会对这项工作的:

Pattern validIpAddressRegex = Pattern.compile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"); 
Pattern validHostnameRegex = Pattern.compile("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$"); 

// matches(String) Will return a boolean value 
validIpAddress.matches("111.222.333.444"); 

我借用this SO answer的正则表达式。查看Wikipedia article on hostnames了解更多关于构成有效主机名的内容。

+0

不是很简单的正则表达式,但确定:D – pootzko 2014-01-15 22:08:39

1

如果你的地址有冒号:那么它就是IPv6地址。其余的字符可以是十六进制数字(0-1,A-F,a-f)。

如果地址只有数字和点,那么它是IPv4地址。

如果地址有任何字母,那么它是主机名(主机名可以有数字,点和其他字符)。

这可以通过简单地实现:

public static String kindOfIP(final String addr) 
    { 
    if (addr.indexOf(":") >= 0) 
     return "IPv6"; 
    if (addr.matches("^\\d+\\.\\d+\\.\\d+\\.\\d+$")) 
     return "IPv4"; 
    return "hostname"; 
    } 

这个代码不检查,如果地址是有效的。

+0

不能有主机名有':'? – Cratylus 2011-03-03 07:58:48

+0

主机名可以有字母,数字或连字符(有些使用下划线,但最好不要使用它)。点是DNS的一部分(您可以使用名称:hostname.domain或stackoverflow.com)。看看:http://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names – 2011-03-03 08:19:55

+0

如果您在浏览器URL地址中看到冒号,那么它通常会指定非标准的服务端口。例如:'http:// localhost:8080 /'。如果你的字符串可以有这样的端口,那么检查地址是否是IPv6,你可以计算有多少':'在地址中。如果超过1,那么它就是IPv6。如果只有一个,它可以分隔主机名和端口。 – 2011-03-03 08:23:44