在 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
方法与(?<=\\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] 相同,如0
或3
\\d+
表示一位或多位数字,例如 1
或 23
\\d+,
表示一个或多个数字后面有逗号,如1,
或234,
\\d+,\\d+,\\d+
将接受三个数字,它们之间有逗号,例如 12,3,456
\\G
表示最后一个匹配,或者如果没有(在第一次使用的情况下)字符串的开头
(?<=...),
是 positive look-behind 将匹配逗号 ,
之前在 (?<=...)
中描述的一些字符串
(?<=\\G\\d+,\\d+,\\d+),
所以将尝试查找前面有三个数字的逗号,并且这些数字前面有字符串的以太网开头(如您的示例中的 ^0,0,1
)或以前匹配的逗号,如 2,4,5
和 3,4,6
。
如果您想使用其他字符然后是数字,您也可以使用其他字符集,例如
\\w
将匹配字母字符、数字和 _
\\S
不是空白的所有内容
[^,]
不是逗号的所有内容
... 等等。更多信息Pattern documentation
顺便说一句,这种形式适用于每隔 3 个、5 个、7 个(和其他奇数)逗号拆分一次,例如 split("(?<=\\G\\w+,\\w+,\\w+,\\w+,\\w+),")
将每隔 5 个逗号拆分一次。
要在第 2、4、6、8 个(以及其余的偶数)逗号上拆分,您需要将 +
替换为 1,maxLengthOfNumber
,如 split("(?<=\\G\\w1,3,\\w1,3,\\w1,3,\\w1,3),")
以在数字最多为 3 时每第 4 个逗号拆分数字(0、00、12、000、123、412、999)。
要拆分每个第二个逗号,您还可以根据我的 previous answer 使用此正则表达式 split("(?<!\\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("(?<=\\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 个逗号分割一个字符串的主要内容,如果未能解决你的问题,请参考以下文章