Java按连续字符拆分

19
我有一个示例,为了更好地解释我正在尝试做什么:
String text = "a,b,,,,c,,";
String[] split = text.split(",");
for(int i=0;i<split.length;i++){
    System.out.println("I = "+i+" "+split[i]);
}

输出结果为:
I = 0 a

I = 1 b

I = 2 

I = 3 

I = 4 

I = 5 c

但是,我想要的是一个大小为8的数组,其中还包含:

I = 6 

I = 7

当然,最后的两个元素将是空字符串,但对我来说获取它们很重要。此外,我认为有它们是合乎逻辑的。我的意思是,如果我有:

String text = "a,b,,,,c,,d";

结果将是一个大小为 8 的数组,我认为这两个示例之间没有太大的区别。
2个回答

25
String[] split = text.split(",", -1);

这个行为看起来很棘手,但实际上在官方文档中有解释(我认为解释得不太好)。如果n为非正数,则模式将被尽可能地应用,并且数组的长度可以是任意的。使用text.split(“,”)的问题在于它等同于text.split(“,”,0)。如文档所述,使用0限制:
如果n为零,则模式将被尽可能多次地应用,数组的长度可以是任意的,并且末尾的空字符串将被丢弃。你绝对不想丢弃空字符串。

6
哇,我没想到在String#split这样基础的东西上还能学到新的东西。我错了。这个问题和答案都非常有教育价值。虽然如此,如果提供给用户一些解释,可以把一个好的答案变得更棒。 - T.J. Crowder
谢谢,它运行得很好!我已经用Java编写应用程序约3年了,但似乎总有新的东西需要学习,即使它们乍一看似乎很简单。 - Anakin001
@T.J.Crowder,我上周刚遇到了这个问题,这个方法有效。实际上,我并不太明白为什么/如何起作用,而且文档也不是很清楚。 - m0skit0

0

如果可以使用外部库,我更喜欢:

String[] split = StringUtils.splitPreserveAllTokens(text, ',');

大多数情况下,StringUtils 库往往比默认的 Java 实现更高效,因为...嘿,这就是 Apache 写它的原因。此外,从方法名称上看,很明显这个 split 在做什么,而普通的字符串分割(带有 -1 限制)乍一看可能不太清楚。


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