Java String拆分无法正常工作

时间:2012-07-10 16:46:49

标签: java split

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);
}

我得到的结果

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

令人惊讶的是长度是7,因为它应该是9,并且你可以看到0.0000之后的值,即两个最后的空值不会到来。让我们说现在,如果我改变字符串测试 “1,O1 ,,,, 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

我不认为我做错了。这是一个错误吗? JAVA版本 - jdk1.6.0_31

3 个答案:

答案 0 :(得分:17)

其行为与the javadoc

中指定的相同
  

此方法的工作方式就像调用带有给定表达式和limit参数为零的双参数split方法一样。 结尾的空字符串因此不包含在结果数组中。

如果您想保留尾随空白字符串,可以使用带有负限制的2 argument split method

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

如果限制是非正数,则模式将被应用尽可能多次,并且数组可以具有任何长度。

答案 1 :(得分:7)

split默默地丢弃尾随分隔符,如Javadoc中所指定的那样。

一般来说,split的行为有点像怪异。请考虑使用Guava's Splitter,它具有更多可预测和可自定义的行为。 (披露:我向Guava捐款。)

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]

答案 2 :(得分: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);