2014-03-12 155 views
15

我想用String.split()如何以逗号分隔字符串分割成空字符串

这里分裂一个数组的数组是我的代码:

String str = ",,,";  
String[] tokens = str.split(","); 

然而,结果标记是一个空数组:[],而不是我想要的数组。

我已经测试改变str一点点:

String str = ",,,1";   
String[] tokens = str.split(","); 

这一次的结果是令牌["","","","1"]。这接近我想要的,但我真的不想在分割之前添加这个“1”。

问题基本上,String.split()将返回一个空数组,如果它只包含空元素""

你能帮助解决问题吗?

+0

如果您使用的是番石榴,“Splitter”。on(“,”)。split(“,,,”)'产生预期的结果。见例如[这个答案](http://stackoverflow.com/a/7488710/56285)了解更多。 – Jonik

回答

35

您需要使用超载的String#split(regex, limit)方法,该方法接受极限参数。

String[] tokens = str.split(",", -1); 

docs(重点煤矿):

限参数控制的被施加图案的次数,并因此影响所得阵列的长度。如果极限值n大于零,那么模式将最多应用n-1次,数组的长度不会大于n,并且数组的最后一项将包含超出最后匹配分隔符的所有输入。 如果n是非正值,那么该模式将尽可能多次应用,并且该数组可以有任意长度。如果n为零,则该模式将尽可能多次应用,该数组可以有任意长度,并且尾随的空字符串将被丢弃。


说明:当你不提供限制参数或提供“零”的限制,split()丢弃尾部空字段。当你提供一个肯定的限制参数时,它将限制字段数量到特定的限制。但是当你提供一个负限制时,split()方法允许任意数量的字段,也不会丢弃尾随的空字段。为了更清楚起见,看看最后有这段代码的Pattern#split(regex, limit)的源代码(注释已经被我添加了,并且没有出现在实际的源代码中)。

if (limit == 0) // When zero or no arg is given 
    while (resultSize > 0 && matchList.get(resultSize-1).equals("")) // if trailing entries are blank 
     resultSize--; // remove them out 

注:如果你不提供任何的限制参数,无极限参数的split()方法调用重载split()方法like this

public String[] split(String regex) { 
    return split(regex, 0); 
} 

还要注意的是,String#split(regex, limit)内部调用Pattern#split(regex, limit)

+2

它的工作原理。谢谢。 –

+1

很好的解释 –

+0

关于上面例子的解释呢?如果我不要求太多。 –