2012-07-10 82 views
2

Java專家,Java字符串拆分不起作用

請查看下面的拆分命令代碼,並讓我知道爲什麼最後兩個空值沒有捕獲。

String test = "1,O1,,,,0.0000,0.0000,,"; 
String[] splittest = test.split(","); 
System.out.println("length -"+splittest.length); 
for (String string : splittest) { 
    System.out.println("value"+string); 
} 

結果IAM越來越

length -7 
value1 
valueO1 
value 
value 
value 
value0.0000 
value0.0000 

令人驚訝的是長度爲7何處,因爲它應該是9,也可以作爲以後還可以0.0000即最後兩個空值看不來。現在讓我們說,如果我改變字符串測試 「1,01 ,,,, 0.0000,0.0000,0,0」

String test = "1,O1,,,,0.0000,0.0000,0,0"; 
String[] splittest = test.split(","); 
System.out.println("length -"+splittest.length); 
for (String string : splittest) { 
    System.out.println("value"+string); 
} 

我得到正確

length -9 
value1 
valueO1 
value 
value 
value 
value0.0000 
value0.0000 
value0 
value0 

我不認爲IAM做錯了。這是一個錯誤嗎? JAVA版本 - jdk1.6.0_31

+0

你採用分體式似乎罰款...我不認爲這是一個錯誤都沒有。 – Makoto 2012-07-10 16:49:06

+0

不要誤解我的意思,要求澄清爲什麼程序的行爲方式是行爲方式沒有任何問題,但是假設它不是代碼問題時有一點問題。實際上,你做對的機會和Java編碼工程師錯誤的機會太小了,甚至在晚些時候甚至不應該進入對話。 – 2012-07-10 16:59:01

回答

17

它表現爲在the javadoc指定:

此方法彷彿通過與給定表達式和爲零的限制參數調用兩個參數分割方法。 因此尾隨的空字符串不包含在結果數組中。

如果你想保留尾隨空白字符串,則可以使用2 argument split method有負極限:

String[] splittest = test.split(",", -1); 

如果限制非正則模式將被應用爲儘可能多次,陣列可以有任何長度。

+0

非常感謝。它有幫助。 – kdev 2012-07-10 17:11:13

7

split悄悄地丟棄尾隨分隔符,如Javadoc中所指定的。

一般而言,split的行爲是種類的奇怪。考慮使用Guava'sSplitter來代替,它具有更可預測和可定製的行爲。 (披露:我貢獻番石榴。)

Splitter.on(',').split("1,O1,,,,0.0000,0.0000,,"); 
// returns [1, O1, , , , 0.0000, 0.0000, , ] 
Splitter.on(',').omitEmptyStrings() 
    .split("1,O1,,,,0.0000,0.0000,,"); 
// returns [1, O1, 0.0000, 0.0000] 
1

如上所述,test.split(",");將忽略尾隨空白字符串。你可以使用兩個參數方法和一個大的第二個參數。但是,API也表示

If n is non-positive then the pattern will be applied as many times 
as possible and the array can have any length. 

其中n是第二個參數。所以,如果你希望所有的尾隨字符串,我會建議

test.split(",", -1);