如何将逗号分隔的字符串拆分为空字符串数组

Cha*_*ang 16 java string split

我想要分割",,,"为4的阵列""使用String.split()

这是我的代码:

String str = ",,,";     
String[] tokens = str.split(",");
Run Code Online (Sandbox Code Playgroud)

但是,结果标记是一个空数组:[],而不是"" (["","","",""])我想要的数组4 .

我已经测试过改变了str一下:

String str = ",,,1";        
String[] tokens = str.split(",");
Run Code Online (Sandbox Code Playgroud)

这次结果令牌是["","","","1"].这接近我想要的,但我真的不想在进行拆分之前添加这个"1".

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

你能帮忙解决问题吗?

Sud*_*hul 37

您需要使用带有String#split(regex, limit)limit参数的重载方法.

String[] tokens = str.split(",", -1);
Run Code Online (Sandbox Code Playgroud)

文档(强调我的):

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


说明:如果未提供limit参数或提供"零"作为限制,则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
Run Code Online (Sandbox Code Playgroud)

注意:如果没有提供任何limit参数,那么split()没有limit参数的split()方法会像这样调用重载方法.

public String[] split(String regex) {
    return split(regex, 0);
}
Run Code Online (Sandbox Code Playgroud)

并且还要注意,String#split(regex, limit)内部调用Pattern#split(regex, limit).

  • AnjanBaradwaj,@ GIJoe - 我用更多的解释和源代码更新了答案. (2认同)