【问题标题】:How to split a comma-delimited string into an array of empty strings [duplicate]如何将逗号分隔的字符串拆分为空字符串数组[重复]
【发布时间】:2014-04-16 12:54:51
【问题描述】:

我想使用 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(",,,") 会产生预期的结果。参见例如this answer 了解更多。

标签: java string split


【解决方案1】:

你需要使用重载的String#split(regex, limit)方法,它接受limit参数。

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

来自docs(重点是我的):

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


说明:当您不提供限制参数或提供“零”作为限制时,split() 会丢弃尾随的空字段。当您提供正限制参数时,它将字段数限制为该特定限制。但是当您提供负限制时,split() 方法允许任意数量的字段,并且也不会丢弃尾随的空字段。为了更清楚,请查看Pattern#split(regex, limit) 的源代码,它的末尾有这个sn-p(cmets 是我添加的,实际源代码中不存在)。

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

注意:如果不提供任何limit参数,不带limit参数的split()方法会调用重载的split()方法like this

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

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

【讨论】:

  • 想为上面的例子解释一下吗?如果我没有要求太多的话。
  • “尽可能多地应用”是什么意思?这如何给我们一个空字符串数组?
  • AnjanBaradwaj,@GIJoe - 我已经用更多解释和源代码更新了答案。
猜你喜欢
  • 2021-02-24
  • 2023-04-09
  • 2018-07-29
  • 1970-01-01
  • 2014-10-15
  • 2018-12-21
  • 1970-01-01
相关资源
最近更新 更多