Javastring拆分删除空值

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

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

我期待得到8个值。 [5,6,7,EMPTY,8,9,EMPTY,EMPTY]但是我只有6个值。

任何想法和如何解决。 无论EMPTY值是否在任何地方,都应该在数组中。

split(delimiter)默认从结果数组中删除尾随的空string。 为了closures这个机制,我们需要使用重载版本的split(delimiter, limit)limit设置为负值

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

更多细节:
split(regex)内部返回split(regex, 0)和在这个方法的文档中 ,你可以find(强调我的)

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

如果极限值n 大于零,那么模式将被最多应用n-1次,数组的长度将不会大于n,并且数组的最后一项将包含超出最后匹配分隔符的所有input。

如果n 是非正值,那么该模式将被应用尽可能多次,并且该数组可以具有任何长度。

如果n 为零,则模式将尽可能多次应用,数组可以有任意长度, 尾随的空string将被丢弃

例外

值得一提的是,删除尾随的空string只有在这样的空string由分割机制创build时才有意义。 所以对于"".split(anything)因为我们不能拆分""更远,我们将得到结果[""]数组。
这是因为在这里没有发生分割,所以""尽pipe是空的,尾部是原始的string,而不是由分割过程创build的空string。

String.split(String regex)的文档:

此方法的工作原理与通过调用给定expression式和极限参数为零的双参数拆分方法一样。 尾随的空string因此不包括在结果数组中。

所以你将不得不使用两个参数版本String.split(String regex, int limit)与负值:

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

文档:

如果极限值n大于零,那么模式将被最多应用n-1次,数组的长度将不会大于n,并且数组的最后一项将包含超出最后匹配分隔符的所有input。 如果n是非正值,那么该模式将被应用尽可能多次,并且该数组可以具有任何长度。 如果n为零,则模式将尽可能多次应用,数组可以有任意长度,尾随的空string将被丢弃。

这不会排除任何空的元素,包括尾随的元素。

String.split()API文档

将该string拆分为给定正则expression式的匹配。 此方法的工作原理与通过调用给定expression式和极限参数为零的双参数拆分方法一样。 尾随的空string因此不包括在结果数组中。

重载String.split(正则expression式,整数)更适合您的情况。

另一种select是使用番石榴的分stream器。 它没有正则expression式的开销(在这种情况下你不需要),默认情况下不会抛弃空的尾随string。

例如:

  String data = "5|6|7||8|9||"; Iterable<String> results = Splitter.on('|').split(data); // convert to array String[] asArray = Iterables.toArray(results, String.class); 

有关更多信息,请参阅wiki: https : //github.com/google/guava/wiki/StringsExplained