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
答案 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);