2012-07-10 78 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);