java字符串检测ip

时间:2011-03-03 07:16:47

标签: java string network-programming

假设包含IP(v4或v6)主机名的java字符串。
在这些案件中检测的最佳方法是什么? 我对IP是否在有效范围内感兴趣(例如IPv4的999.999.999.999) 我感兴趣的只是一种检测String是主机名还是IP(v4或v6)的方法 最初我虽然这样:

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

但我不确定是否应该始终期望包含@的格式。

由于

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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";
    }

此代码不检查地址是否有效。

答案 2 :(得分:0)

使用regular expression匹配vs ip,如果它不是ip,那么它是一个主机名。