【问题标题】:How to split a string by every other separator如何用其他分隔符分割字符串
【发布时间】:2017-02-17 14:16:47
【问题描述】:

有一个字符串

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

如何将它拆分成这样的字符串 “ggg;ggg;” “nnn;nnn;” “啊啊;啊啊;” “xxx;xxx;” ???????

【问题讨论】:

  • 一种方法是在每个分隔符处拆分它,然后重新组合成对。另一种方法是编写一个显式的有限状态机。

标签: java


【解决方案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

【讨论】:

  • Iterables 使用了什么库?
  • guava-18.0.jar。如果我解决了您的问题,请标记正确并投票。
  • 请编辑您的答案并包含指向您的答案的链接
  • 谢谢,但这里不工作。抛出 NullPointerException。
  • 你能分享你的意见吗??
【解决方案2】:

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

你看,在你的例子中,有两个相似之处:

  1. 所有模式似乎都只有三个字符
  2. 所有模式恰好出现两次

换句话说:如果您的所有输入都真正满足这两个属性,您可以避免拆分 - 因为您知道确切在您的每个位置可以找到什么细绳。

当然,遵循“真实”拆分的其他答案更灵活;但是(理论上),您可以继续进行一系列子字符串调用,以便直接访问所有元素。

【讨论】:

    【解决方案3】:

    使用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;

    【讨论】:

    • 这适用于 3 个重复字符后跟分号的特定模式,但不适用于任何类似但略有不同的模式,例如 gg;ggg;n;nnnn;所以这个简洁的解决方案对于一般用途的适用性是相当有限的。
    【解决方案4】:

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

    如果不是这样,那么您可能必须使用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;
    }
    

    【讨论】:

      【解决方案5】:

      将 split 与正则表达式一起使用:

      String data="ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;";
      String [] array=data.split("(?<=\\G\\S\\S\\S;\\S\\S\\S);");
      
      • S:非空白字符
      • G:最后一个匹配项/字符串的开始,想办法跳过分隔符,如果 前一个字符串与当前字符串匹配。
      • ?

      【讨论】:

      • 编译器说“非法转义字符”。
      • 字符串数据="ggg;ggg;nnn;nnn;aaa;aaa;xxx;xxx;"; String [] array=data.split("(?
      • 当我从 Eclipse 复制它时,它忽略了第一个 \
      猜你喜欢
      • 2013-05-03
      • 2018-04-01
      • 1970-01-01
      • 2021-06-12
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多