Java String的split方法忽略空子串

今天我发现java String.split()的行为很奇怪。

实际上我想通过.split(",")将字符串"aa,bb,cc,dd,,,ee"拆分为数组.split(",")它给我一个字符串数组["aa","bb","cc","dd","","","ee"]长度为7。

但是当我尝试将一个字符串"aa,bb,cc,dd,,,,"拆分为数组时,这给了我一个长度为4的数组只表示["aa","bb","cc","dd"]拒绝所有下一个空白字符串。

我想要一个程序,将像"aa,bb,cc,dd,,,,"这样的字符串拆分为数组["aa","bb","cc","dd","","",""]

java.lang.String api有可能吗? 提前致谢。

使用具有负限制的String.split(String regex, int limit) (例如-1)。

 "aa,bb,cc,dd,,,,".split(",", -1) 

当调用String.split(String regex) ,调用limit = 0,这将删除数组中所有尾随的空字符串(在大多数情况下,请参见下文)。

String.split(String regex)的实际行为非常混乱:

  • 拆分空字符串将导致长度为1的数组。 空字符串拆分将始终导致包含空字符串的长度为1的数组
  • 拆分";"";;;" regex";" 将导致一个空数组。 非空字符串拆分将导致删除数组中的所有尾随空字符串

从至少Java 5到Java 8可以观察到上述行为。

在JDK-6559590中拆分空字符串时,尝试更改行为以返回空数组。 然而,它很快在JDK-8028321中被恢复,当它在各个地方引起回归时。 这种变化从未进入最初的Java 8版本。

你可以使用public String[] split(String regex, int limit)

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


 String st = "aa,bb,cc,dd,,,,"; System.out.println(Arrays.deepToString(st.split(",",-1))); ↑ 

打印:

 [aa, bb, cc, dd, , , , ]