Java中如何根据多个连续逗号拆分字符串

7
String abc = "a,b,c,d,,,";
String[] arr = abc.split(",");
System.out.println(arr.length);

输出结果为4。但是我的期望值是7。以下是我的解决方案:

String abc = "a,b,c,d,,,";
abc += "\n";
String[] arr = abc.split(",");
System.out.println(arr.length);

为什么会发生这种情况?有没有更好的解决方案?

1
使用 str.split(",", -1) 方法,这是一个重载方法。 - niiraj874u
5个回答

9
使用String#split()的另一种版本,它需要两个参数来实现此目的:
String abc = "a,b,c,d,,,";
String[] arr = abc.split(",", -1);
System.out.println(arr.length);

这会打印出

7

如果n是非正数,则该模式将尽可能地应用多次,并且数组可以具有任何长度。如果n为零,则该模式将尽可能地应用多次,数组可以具有任何长度,并且尾随空字符串将被丢弃。

使用重载的 split() 而不是正则表达式,加一分。 - Azar

4

您可以使用前瞻:

String abc = "a,b,c,d,,,";
String[] arr = abc.split("(?=,)");
System.out.println(arr.length); //7

你的评论是什么意思?简单的前瞻如何变得复杂? - anubhava
你似乎在做白日梦。谁在这里推荐了正则表达式手册?对于未知的情况,在Java中没有不支持正则表达式的split函数。 - anubhava
你知道,我知道,大多数Jdevs也知道(至少我希望大多数人都知道)......但并非所有人都知道,使用此解决方案需要了解不仅最基本的正则表达式规则,还需要了解组和前瞻运算符。 - endriu_l
你可以与标记为“regex”的OP战斗。任何具有基本正则表达式知识的人都能理解简单的前瞻,这里没有正则表达式组。你可能不理解前瞻语法。 - anubhava
底线是,你的解决方案不起作用,因为它在每个元素后面添加了分隔符,请不要再吹嘘它了。 - endriu_l
显示剩余3条评论

1

使用:

String[] arr = abc.split("(?=,)");

分割abc


这里并非如此,虽然它能够工作,但它会使正则表达式的情况变得复杂 - 特定运算符。 - endriu_l

1
这是因为split不仅包含尾随的空字符串,而且如果在末尾有\n,则最后一个元素不为空。
[a, b, c, d, , , \n]

0

split()函数专门用于这个任务。您可以通过以下方式计算字符或字符串的出现次数。

        String ch = ",";
    int count = 0;
    int pos = 0;
    int idx;
    while ((idx = abc.indexOf(ch, pos)) != -1) {
        ++count;
        pos = idx + sub.length();
    }
    System.out.println(count);

这个逻辑在Spring中被使用。


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