Java 字符串拆分删除了空值

2022-08-31 04:47:40

我正在尝试使用分隔符拆分值。但我发现了令人惊讶的结果

String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);

我期望得到8个值。[5,6,7,空,8,9,空,空]但我只得到6个值。

任何想法和如何修复。无论空值出现在任何地方,它都应该在数组中。


答案 1

split(delimiter)默认情况下,从结果数组中删除尾随的空字符串。要关闭此机制,我们需要使用设置为负值的重载版本,例如split(delimiter, limit)limit

String[] split = data.split("\\|", -1);

更多细节:
在内部返回此方法的结果,并在您可以找到的文档中找到(强调我的)split(regex)split(regex, 0)

该参数控制应用模式的次数,因此会影响结果数组的长度。limit

如果限制大于零,则模式将最多应用 n - 1 次,数组的长度将不大于 n,数组的最后一个条目将包含除最后匹配的分隔符之外的所有输入。n

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

如果 为,则模式将尽可能多地应用,数组可以具有任何长度,并且将丢弃尾随的空字符串n

例外情况

值得一提的是,仅当此类空字符串是由拆分机制创建的时,删除尾随空字符串才有意义。因此,由于我们无法进一步拆分,我们将得到结果数组。
发生这种情况是因为拆分在这里没有发生,所以尽管是空的并且尾随表示原始字符串,而不是通过拆分过程创建的空字符串。"".split(anything)""[""]""


答案 2

来自 String.split(String regex) 的文档

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

因此,您必须使用具有负值的两个参数版本 String.split(字符串正则表达式,int 限制):

String[] split = data.split("\\|",-1);

医生:

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

这不会遗漏任何空元素,包括尾随元素。