假設一個包含IP(v4或v6)或主機名的java字符串。
在這些情況下檢測的最佳方法是什麼?
我對IP是否處於有效範圍(例如IPv4的999.999.999.999)沒有太多興趣。
我感興趣的只是一種檢測字符串是主機名還是IP(v4或v6)的方法。
起初我以爲這樣的:java的字符串檢測ip
if(theString.indexOf("@")!=-1){
//Not an Ip
}
,但我不知道我是否應該總是指望含@
始終的格式。
感謝
假設一個包含IP(v4或v6)或主機名的java字符串。
在這些情況下檢測的最佳方法是什麼?
我對IP是否處於有效範圍(例如IPv4的999.999.999.999)沒有太多興趣。
我感興趣的只是一種檢測字符串是主機名還是IP(v4或v6)的方法。
起初我以爲這樣的:java的字符串檢測ip
if(theString.indexOf("@")!=-1){
//Not an Ip
}
,但我不知道我是否應該總是指望含@
始終的格式。
感謝
一套簡單與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瞭解更多關於構成有效主機名的內容。
不是很簡單的正則表達式,但確定:D – pootzko 2014-01-15 22:08:39
使用regular expression匹配VS IP,如果它不是IP那麼它是一個主機名。
如果你的地址有冒號:
那麼它就是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";
}
這個代碼不檢查,如果地址是有效的。
不能有主機名有':'? – Cratylus 2011-03-03 07:58:48
主機名可以有字母,數字或連字符(有些使用下劃線,但最好不要使用它)。點是DNS的一部分(您可以使用名稱:hostname.domain或stackoverflow.com)。看看:http://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names – 2011-03-03 08:19:55
如果您在瀏覽器URL地址中看到冒號,那麼它通常會指定非標準的服務端口。例如:'http:// localhost:8080 /'。如果你的字符串可以有這樣的端口,那麼檢查地址是否是IPv6,你可以計算有多少':'在地址中。如果超過1,那麼它就是IPv6。如果只有一個,它可以分隔主機名和端口。 – 2011-03-03 08:23:44
您正在尋找主機名中的'@'?我發佈了一個答案,但我不確定你爲什麼關注那個角色。 – 2011-03-03 07:23:03
是不是somename @ domainName是一個有效的主機名? – Cratylus 2011-03-03 07:33:22
這可能是一個電子郵件地址。主機名是指在DNS中查詢時可能會以某種方式解決的名稱。在這裏看到更多:http://en.wikipedia.org/wiki/Hostname – 2011-03-03 08:39:04