我有一个看起来像这样的字符串:
0,0,1,2,4,5,3,4,6
我想要返回的是一个 String[]
,它在每第 3 个逗号之后被拆分,所以结果将如下所示:
[ "0,0,1", "2,4,5", "3,4,6" ]
我发现了类似的函数,但它们不会拆分为第 n 个逗号。
最佳答案
注意:虽然使用 split
的解决方案可能有效(最后一次在 Java 17 上进行测试)它基于错误,因为 Java 中的前瞻性应该显而易见 最大长度。这个限制理论上应该阻止我们使用 +
但不知何故 \G
at start 让我们在这里使用 +
。 将来可能会修复此错误,这意味着 split
将停止工作。
更安全的方法是使用 Matcher#find
之类的
String data = "0,0,1,2,4,5,3,4,6";
Pattern p = Pattern.compile("\\d+,\\d+,\\d+");//no look-ahead needed
Matcher m = p.matcher(data);
List<String> parts = new ArrayList<>();
while(m.find()){
parts.add(m.group());
}
String[] result = parts.toArray(new String[0]);
您可以尝试将 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+),
so 将尝试查找前面有三个数字的逗号,并且这些数字前面有字符串的以太开头(如您的示例中的^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\\w{1,3},\\w{1,3},\\w{1,3},\\w{1,3}),")
在数字最多有 3 位(0、00、 12、000、123、412、999)。
要拆分每个第二个逗号,您还可以使用基于我的 previous answer 的正则表达式 split("(?<!\\G\\d+),")
关于java - 在 Java 中每隔 3 个逗号拆分一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17892284/