2011-03-03 56 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