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



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

我的字符串就像"(a,b(1,2,3),c,d(a,b,c))".

如何获得["a","b(1,2,3)","c","d(a,b,c)"]数组?

我显然不能使用 .split(",") ,因为它也会拆分我的子字符串。

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

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]);
}

基本上,我们遍历字符串的所有字符,跟踪括号。不考虑第一个和最后一个括号。只有当我们看到相同数量的左括号和右括号并且当前字符为","时,我们才会拆分字符串。

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

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

最新更新