如何通过每隔一个分隔符拆分一个字符串

时间:2016-10-08 19:37:29

标签: java

有一个字符串

String str = "ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;";

如何将其拆分为这样的字符串    “GGG; GGG;”    “NNN; NNN;”    “AAA; AAA;”    “XXX; XXX;” ???????

5 个答案:

答案 0 :(得分:2)

使用Regex

    String input = "ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;";
    Pattern p = Pattern.compile("([a-z]{3});\\1;");
    Matcher m = p.matcher(input);
    while (m.find())
        // m.group(0) is the result
        System.out.println(m.group(0));

将输出

  

GGG; GGG;

     

NNN; NNN;

     

AAA; AAA;

     

XXX; XXX;

答案 1 :(得分:1)

拆分并加入他们。

 public static void main(String[] args) throws Exception {
        String data = "ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;";
        String del = ";";
        int splitSize = 2;

        StringBuilder sb  = new StringBuilder();
        for (Iterable<String> iterable : Iterables.partition(Splitter.on(del).split(data), splitSize)) {
            sb.append("\"").append(Joiner.on(del).join(iterable)).append(";\"");
        }
        sb.delete(sb.length()-3, sb.length());
        System.out.println(sb.toString());

    }

参考: Split a String at every 3rd comma in Java

答案 2 :(得分:1)

我假设您只想检查最后一个段是否相似,而不是每个已读取的段。

如果情况并非如此,那么您可能需要使用ArrayList代替Stack

我还假设每个段的格式为/([a-z])\1\1/

如果不是这种情况,那么你应该用:

更改if语句

(stack.peek().substring(0,index).equals(temp))

public static Stack<String> splitString(String text, char split) {
    Stack<String> stack = new Stack<String>();
    int index = text.indexOf(split);
    while (index != -1) {
        String temp = text.substring(0, index);
        if (!stack.isEmpty()) {
            if (stack.peek().charAt(0) == temp.charAt(0)) {
                temp = stack.pop() + split + temp;
            }
        }
        stack.push(temp);
        text = text.substring(index + 1);
        index = text.indexOf(split);
    }
    return stack;
}

答案 3 :(得分:1)

使用正则表达式拆分:

String data="ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;";
String [] array=data.split("(?<=\\G\\S\\S\\S;\\S\\S\\S);");
  • S:非空白字符
  • G:字符串的最后一个匹配/开始,想想它是一种跳过分界的方法 上一个字符串与当前字符串匹配。
  • ?&lt; =:正面后视将匹配在其后面有字符串的分号。

答案 4 :(得分:0)

其他一些答案,仅适用于您的具体示例输入。

您可以看到,在您的示例中,有两个相似之处:

  1. 所有模式似乎都有三个字符
  2. 所有模式恰好发生两次
  3. 换句话说:如果您的所有输入都真正满足了这两个属性,那么可以避免分裂 - 因为您知道完全在您的每个位置找到的内容串。

    当然,遵循“真实”分裂的其他答案更灵活;但是(理论上),你可以继续前进并做一堆子串调用,以便直接访问所有元素。