2

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

4

3 回答 3

17

它的行为与 javadoc 中指定的一样:

此方法的工作方式就像通过使用给定表达式和零限制参数调用双参数拆分方法一样。因此,尾随的空字符串不包含在结果数组中。

如果要保留尾随的空白字符串,可以使用带有负限制的2 参数拆分方法:

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

如果限制为非正数,则该模式将尽可能多地应用,并且数组可以具有任意长度。

于 2012-07-10T16:48:57.233 回答
7

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

一般来说, 的split行为有点奇怪。考虑改用番石榴 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]
于 2012-07-10T16:49:06.217 回答
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);

于 2012-07-10T17:00:23.483 回答