可以嵌套分隔符时拆分字符串

时间:2018-01-24 09:28:31

标签: java split nested

我在尝试使用嵌套分隔符拆分字符串时遇到了一些麻烦。

My String就像"(a,b(1,2,3),c,d(a,b,c))"

我怎样才能获得数组["a","b(1,2,3)","c","d(a,b,c)"]

我显然无法使用.split(","),因为它也会分割我的子字符串。

2 个答案:

答案 0 :(得分:3)

这是一个直接的非递归函数,可以按照您想要的方式分割字符串:

private String[] specialSplit(String s) {
    List<String> result = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    int parenCount = 0;
    for (int i = 1; i < s.length() - 1; i++) { // go from 1 to length -1 to discard the surrounding ()
        char c = s.charAt(i);
        if (c == '(') parenCount++;
        else if (c == ')') parenCount--;

        if (parenCount == 0 && c == ',') {
            result.add(sb.toString());
            sb.setLength(0); // clear string builder
        } else {
            sb.append(c);
        }
    }
    result.add(sb.toString());
    return result.toArray(new String[0]);
}

基本上,我们遍历字符串的所有字符,跟踪括号。不考虑第一个和最后一个括号。当我们看到相同数量的开括号和右括号以及当前字符是&#39;时,我们只分割字符串。

此方法的运行速度可能比您可能找到的任何正则表达式快得多。

答案 1 :(得分:2)

递归函数应该在这里工作,而不是普通的split()。尝试逐个字符地解析字符串,并在遇到逗号或paranthesis时执行操作:,表示您创建一个新元素,(您启动一个新的嵌套列表,)表示您完成了当前嵌套列表。这甚至应该使用更“展开”的方法(即没有递归,但处理数据结构中的嵌套)。