Java的String.split()删除尾随空条目

时间:2012-08-16 18:03:19

标签: java split

我正在尝试解析一些管道分隔的记录。我有这个代码:

public class Test {
    public static void main(String[] args) throws Exception {
        String[] components = "EN|1056209|||KA3NDL|L|||||||||||||||||||||".split("\\|");
        System.out.println(java.util.Arrays.toString(components));
    }
}

你希望它打印出来:

[EN, 1056209, , , KA3NDL, L, , , , , , , , , , , , , , , , , , , , , ]

但事实并非如此。它打印:

[EN, 1056209, , , KA3NDL, L]

访问length数组的components属性表明它正在正确打印。

有人知道为什么这是/解决方法吗?

修改

这有效:

public class Test {
    public static void main(String[] args) throws Exception {
        String[] components = "EN|1056209|||KA3NDL|L|||||||||||||||||||||".split("\\|", -1);
        System.out.println(java.util.Arrays.toString(components));
    }
}

4 个答案:

答案 0 :(得分:15)

没有limit参数的

String.split会从结果数组中删除所有尾随空Strings。您需要包含限制:

String str = "EN|1056209|||KA3NDL|L|||||||||||||||||||||";
String[] components = str.split("\\|", -1);

来自String.split(String, int)

  

如果n是非正数,那么模式将被应用尽可能多次,并且数组可以具有任何长度。如果n为零,那么模式将被应用尽可能多次,数组可以具有任何长度,并且尾随空字符串将被丢弃。

调用String.split(String)相当于调用2-argument split,其限制为 0

答案 1 :(得分:4)

您可以将限制传递给split方法,以便保留尾随的空字符串:

"EN|1056209|||KA3NDL|L|||||||||||||||||||||".split("\\|", -1)

答案 2 :(得分:2)

请改用split()的双参数版本。它允许您配置是否也应返回空字符串。

答案 3 :(得分:1)

在优秀的番石榴图书馆中查看Splitter

String input = "EN|1056209|||KA3NDL|L|||||||||||||||||||||";
Iterable<String> splitIter = Splitter.on("|").split(input);
System.out.println(splitIter);

输出:

[EN, 1056209, , , KA3NDL, L, , , , , , , , , , , , , , , , , , , , , ]