java - 在 Java 中每隔 3 个逗号拆分一个字符串

标签 java arrays split

我有一个看起来像这样的字符串:

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]相同,如03
  • \\d+ 表示一个或多个数字,如 123
  • \\d+, 表示一个或多个数字后带逗号,如 1,234,
  • \\d+,\\d+,\\d+ 会像 12,3,456 一样接受三个数字之间用逗号分隔
  • \\G 表示最后一次匹配,或者如果没有(在第一次使用的情况下)字符串的开头
  • (?<=...),positive look-behind,它将匹配逗号 ,,它前面还有 (?<=...) 中描述的一些字符串
  • (?<=\\G\\d+,\\d+,\\d+), so 将尝试查找前面有三个数字的逗号,并且这些数字前面有字符串的以太开头(如您的示例中的 ^0,0,1 )或先前匹配的逗号,如 2,4,53,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/

相关文章:

java - Android @NonNull 和 Jetbrains @NonNull 有什么区别

java - 类型错误 : Cannot find function getElementById in object

java - 如何在应用嵌套分组时保留所有子组通过收集器

java - 什么是 LD_LIBRARY_PATH 以及如何使用它?

c++ - 如何创建用于添加两个矩阵的函数?它会返回什么?

c++ - 数组的静态绑定(bind)和动态绑定(bind)的区别

javascript - 更改 [].__proto__.constructor 和 [].constructor 差异的行为

python - 使用 REGEX 分割字符串

java - 拆分返回 null

split - AttributeError: 'DatasetAutoFolds' 对象没有属性 'split'