假设包含IP(v4或v6)或主机名的java字符串。
在这些案件中检测的最佳方法是什么?
我对IP是否在有效范围内感兴趣(例如IPv4的999.999.999.999)
我感兴趣的只是一种检测String是主机名还是IP(v4或v6)的方法
最初我虽然这样:
if(theString.indexOf("@")!=-1){
//Not an Ip
}
但我不确定是否应该始终期望包含@
的格式。
由于
答案 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,那么它是一个主机名。