Java String的split方法忽略空子串

时间:2014-02-05 11:05:32

标签: java regex arrays string split

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

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

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

我想要一个将"aa,bb,cc,dd,,,,"之类的字符串拆分为数组["aa","bb","cc","dd","","",""]的过程。

这可以用java.lang.String api吗?提前谢谢。

2 个答案:

答案 0 :(得分:25)

使用带有负限制的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版本。

答案 1 :(得分:4)

您可以使用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, , , , ]