2012-07-12 53 views
23

我得到這個簡單的代碼時,返回null:String.split使用點

String ip = "1.2.3.4"; 
String[] ipArray = ip.split("."); 
System.out.println(ipArray[1]); 

而且ipArray是它擊中System.out.println的時間空(拋出空指針異常)。

我的問題是爲什麼ipArray保持null,即使我將它設置爲分割每個IP的.s?

+0

您正在分割任何字符,因此所有字符都將被分割,而不會在數組中留下任何內容。 [string.split](http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split(java.lang.String))需要一個正則表達式。 – mellamokb 2012-07-12 17:25:14

+4

Dot'.'表示「任何字符」:)您需要一個「實際點」'[。]' – dasblinkenlight 2012-07-12 17:25:21

+0

準確地說,根據模式(DOTALL),'.'將匹配或不匹配換行符。我可以添加 – nhahtdh 2012-07-12 17:26:34

回答

44

使用ip.split("\\.");你的問題將得到解決。問題是String#split接收到一個正則表達式,點(。)符號是正則表達式中的一個特殊字符,所以您需要將其轉義爲被解釋爲普通點,並且反斜槓是Java中的轉義字符,你也必須逃避它。

+0

好的,謝謝。我會接受一次,我可以^ _ ^ – CyanPrime 2012-07-12 17:28:06

41

.是正則表達式中的一個特殊字符,用於分割字符串。

要解決這個問題,您需要轉義.。這導致我們\.不幸的是,\也是在java字符串中的特殊字符,所以還必須逃脫,使\\.

我們的「最終」結果是ip.split("\\.");

在一個相關的問題,整個過程可以完全避免。做一些標準庫已經爲我們做的事情沒有意義。

考慮以下

byte[] ipOctets = InetAddress.getByName(ip).getAddress(); 

唯一這裏的問題是要記住,如果你想要的int值,你有提取它&int octet = ipOctets[0] & 0xFF;

5

Pattern.quote(String)也可以用來引用整個字符串。這將返回一個將從字面上解釋的模式,特殊字符將沒有特殊含義。在這種情況下,這可能是矯枉過正的,但有時它可能會有用。