【问题标题】:Split a String at every 3rd comma in Java在 Java 中每隔 3 个逗号分割一个字符串
【发布时间】: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 或在 , 上拆分,然后将结果以三个一组的形式再次粘合在一起。

标签: java arrays split comma


【解决方案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\\w{1,3},\\w{1,3},\\w{1,3},\\w{1,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\\d{1,100}(,\\d{1,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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-27
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 2016-09-16
        • 1970-01-01
        相关资源
        最近更新 更多