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

18

我想要使用 String.split() 方法,将字符串 ",,," 拆分成一个包含 4 个空字符串 "" 的数组。

以下是我的代码:

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

然而,结果令牌是一个空数组: [],而不是我想要的由4个"" (["","","",""]) 组成的数组。

我已经尝试对str进行了一些修改:

String str = ",,,1";        
String[] tokens = str.split(",");
这次的结果标记是["","","","1"]。这接近于我想要的,但在执行分割之前我真的不想添加这个"1"。
问题基本上是,String.split()如果仅包含空元素"",它将返回一个空数组。
你能帮忙解决这个问题吗?

如果您正在使用Guava,Splitter.on(",").split(",,,")将产生预期的结果。更多信息请参见例如此答案 - Jonik
1个回答

37
你需要使用带有limit参数的重载String#split(regex, limit)方法。
String[] tokens = str.split(",", -1);

根据文档(我强调的部分):

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


解释: 当你没有提供limit参数或提供"零"作为限制时,split()方法会丢弃尾随的空字段。当您提供正limit参数时,它将限制字段的数量为该特定限制。但是,当您提供负限制时,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()方法,就像这样

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

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


能否为上面的例子解释一下?如果不是太麻烦的话。 - Anjan Baradwaj
“尽可能多次应用”是什么意思?这如何给我们提供一个空字符串数组? - Engineer2021
2
AnjanBaradwaj,@GIJoe - 我已经更新了答案,并加入了更多的解释和源代码。 - Rahul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接