在 Java 中每隔 3 个逗号分割一个字符串

Posted

技术标签:

【中文标题】在 Java 中每隔 3 个逗号分割一个字符串【英文标题】:Split a String at every 3rd comma in Java 【发布时间】:2013-07-27 08:50:56 【问题描述】:

我有一个如下所示的字符串:

0,0,1,2,4,5,3,4,6

我想要返回的是一个String[],它在每 3 个逗号之后被拆分,所以结果如下所示:

[ "0,0,1", "2,4,5", "3,4,6" ]

我发现了类似的函数,但它们不会在第 n 个逗号处拆分。

【问题讨论】:

您是否尝试过自己编写一个函数来解析/拆分它? 一种可能有用的方法是首先将0,0,1,2,4,5,3,4,6 更改为0,0,1|2,4,5|3,4,6,这是一个相当简单的正则表达式替换翻译。或者,直接使用 Matcher 并逐步遍历它as shown here。 我能想到的两种方法:在 while 循环中使用 indexOf 或在 , 上拆分,然后将结果以三个一组的形式再次粘合在一起。 【参考方案1】:

必填Guava 回答:

String input = "0,0,1,2,4,5,3,4,6";
String delimiter = ",";
int partitionSize = 3;

for (Iterable<String> iterable : Iterables.partition(Splitter.on(delimiter).split(s), partitionSize)) 
    System.out.println(Joiner.on(delimiter).join(iterable));

输出:

0,0,1
2,4,5
3,4,6

【讨论】:

【参考方案2】:

您可以尝试将split 方法与(?&lt;=\\G\\d+,\\d+,\\d+), 正则表达式一起使用

演示

String data = "0,0,1,2,4,5,3,4,6";
String[] array = data.split("(?<=\\G\\d+,\\d+,\\d+),"); //Magic :) 
// to reveal magic see explanation below answer
for(String s : array)
    System.out.println(s);

输出:

0,0,1
2,4,5
3,4,6

解释

\\d 表示一位数,与[0-9] 相同,如03 \\d+ 表示一位或多位数字,例如 123 \\d+, 表示一个或多个数字后面有逗号,如1,234, \\d+,\\d+,\\d+ 将接受三个数字,它们之间有逗号,例如 12,3,456 \\G 表示最后一个匹配,或者如果没有(在第一次使用的情况下)字符串的开头 (?&lt;=...), 是 positive look-behind 将匹配逗号 , 之前在 (?&lt;=...) 中描述的一些字符串 (?&lt;=\\G\\d+,\\d+,\\d+), 所以将尝试查找前面有三个数字的逗号,并且这些数字前面有字符串的以太网开头(如您的示例中的 ^0,0,1)或以前匹配的逗号,如 2,4,53,4,6

如果您想使用其他字符然后是数字,您也可以使用其他字符集,例如

\\w 将匹配字母字符、数字和 _ \\S 不是空白的所有内容 [^,] 不是逗号的所有内容 ... 等等。更多信息Pattern documentation

顺便说一句,这种形式适用于每隔 3 个、5 个、7 个(和其他奇数)逗号拆分一次,例如 split("(?&lt;=\\G\\w+,\\w+,\\w+,\\w+,\\w+),") 将每隔 5 个逗号拆分一次。

要在第 2、4、6、8 个(以及其余的偶数)逗号上拆分,您需要将 + 替换为 1,maxLengthOfNumber,如 split("(?&lt;=\\G\\w1,3,\\w1,3,\\w1,3,\\w1,3),") 以在数字最多为 3 时每第 4 个逗号拆分数字(0、00、12、000、123、412、999)。

要拆分每个第二个逗号,您还可以根据我的 previous answer 使用此正则表达式 split("(?&lt;!\\G\\d+),")

【讨论】:

您还可以将 \\d+ 替换为 [^,]* 以使其适用于任何非逗号的内容。所以它适用于 "a,b,c,f,g,h,x,y,z" @agbinfo 是的,没错,但由于 OP 询问数字,我使用了 \\d。无论如何很好的附加信息,将包括它来回答。 @Pshemo 另外,您可能没有意识到这一点,但许多有信誉的消息来源说您不能在 Java 中进行这种无限后视...只有某种有限形式的变量后视......所以作为一个正则表达式的粉丝,这个答案绝对值得一票。例如,参见 Jan Goyvaerts,Java takes things a step further by allowing finite repetition. You still cannot use the star or plus。事实上,即使是 dot-star 或 dot-plus,看起来也不错。也许是一个新的 Java 版本故事(Java 7 中已经存在)。 如果我想在第 20 个逗号的间隔上拆分值,或者说该值是否是动态的。我们不能使用一些变量来放置第 n 个数字吗? @b22 "on interval of 20th comma" 那么答案应该解释它(如果不清楚,你能指出让你感到困惑的部分吗?)。 “或者让我们说这个值是否是动态的”这取决于你对动态的看法。开始使用正则表达式后,您无法更改它的工作方式,但您可以在构建时使用动态值。如果您正在寻找类似.split("(?&lt;=\\G\\d1,100(,\\d1,100)"+n+"),") 的东西,那么不幸的是这将不起作用(很难解释为什么正则表达式无法在这里计算出最大长度,因为n 将代表现有值)。【参考方案3】:

编码道场的好作品!这是我的老式 C 风格答案:

如果我们将逗号之间的位称为“部分”,而将结果拆分为“子字符串”,则:

n 是到目前为止找到的零件数量, i 是下一部分的开始, startIndex当前子串的开始

每三部分对部分进行迭代:切掉一个子字符串。

当逗号用完时,将剩余部分添加到结果中。

List<String> result = new ArrayList<String>();
int startIndex = 0;
int n = 0;
for (int i = x.indexOf(',') + 1; i > 0; i = x.indexOf(',', i) + 1, n++) 
    if (n % 3 == 2) 
        result.add(x.substring(startIndex, i - 1));
        startIndex = i;
    

result.add(x.substring(startIndex));

【讨论】:

【参考方案4】:

试试下面的方法:

public String[] mySplitIntoThree(String str) 

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

    List<String> strList = new ArrayList<String>();

    for(int x = 0; x < parts.length - 2; x = x+3) 
    
        String tmpStr = parts[x] + "," + parts[x+1] + "," + parts[x+2];

        strList.add(tmpStr);
    

    return strList.toArray(new String[strList.size()]);

(可能需要导入 java.util.ArrayList 和 java.util.List)

【讨论】:

以上是关于在 Java 中每隔 3 个逗号分割一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

SQL拆分逗号分隔的字符串

SQL拆分逗号分隔的字符串

Java 以逗号分割的字符串数据取出来,逗号前面的字符

sed/awk:每隔 n 个字符插入逗号

如何在 Java 中用逗号和换行符 (\n) 分割字符串? [复制]

用于解析没有逗号的解析的字符串