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

Nic*_*ell 3 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

你希望它打印:

[EN, 1056209, , , KA3NDL, L, , , , , , , , , , , , , , , , , , , , , ]
Run Code Online (Sandbox Code Playgroud)

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

[EN, 1056209, , , KA3NDL, L]
Run Code Online (Sandbox Code Playgroud)

访问数组的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));
    }
}
Run Code Online (Sandbox Code Playgroud)

pb2*_*b2q 15

String.split如果没有limit参数,Strings则从结果数组中删除所有尾随空.您需要包含一个限制:

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

来自String.split(String, int):

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

调用String.split(String)等同于调用split限制为0的2参数.