Java String split()的意外行为

时间:2013-08-02 00:00:40

标签: java parsing split whitespace

我正在尝试使用String split函数拆分字符串,这是一个例子:

    String[] list = "   Hello   ".split("\\s+");
    System.out.println("String length: " + list.length);
    for (String s : list) {
        System.out.println("----");
        System.out.println(s);
    }

这是输出:

String length: 2
----

----
Hello

如您所见,前导空格在String数组中变为空元素,但尾部空格不是。

有谁知道为什么?

2 个答案:

答案 0 :(得分:3)

您需要使用指定限制的other split method并指定-1的限制

String[] list = "   Hello   ".split("\\s+", -1);

保留尾随空格, - 默认行为是根据javadoc

省略尾随空格

修改(answer for comment):

要修剪前导空格,您可以在拆分String

之前剥离前导空格
String str = "   Hello   ".replaceAll("^\\s+", "");
String[] list = str.split("\\s+", -1);

答案 1 :(得分:2)

来自split documentation

  

此方法的工作方式与一样,方法是使用给定表达式和limit参数零调用双参数split方法。因此,尾随空字符串不包含在结果数组中。

所以实际上split(regex)与使用

相同
split(regex, 0);

及其documentation

  

limit参数控制模式的应用次数,因此会影响结果数组的长度。如果限制 n 大于零,则模式最多应用 n - 1 次,数组的长度不会大于 n ,并且数组的最后一个条目将包含除最后一个匹配分隔符之外的所有输入。 如果 n 是非正数,则模式将被应用尽可能多次,并且数组可以具有任何长度。如果n为零,那么模式将被应用尽可能多次,数组可以具有任何长度,并且尾随空字符串将被丢弃。

因此,如果要包含尾随空字符串,则只需使用非零值,如

split("\\s+",10);

但这也会将结果数组限制为最多10个元素。要摆脱这个问题,请使用一些负数,如

split("\\s+",-1);