当存在转义引号或括号外时,在逗号外部分割逗号

Max*_*Max 3 java string split

是否可以使用以下条件拆分字符串?

  • 拆分,(即逗号)
  • 在每个元素上,忽略在第一个'和最后一个'内查看逗号
  • 在每个元素上,忽略在第一个(和最后一个)内检查逗号

例如

String source = "to_char(DATE, 'YYYY,MM,DD'), 'I am sad :(', to_char(DATE, ('YYYY(MM,DD)')), to_char(DATE, ('YYYY,MM,DD)')), to_char(DATE, ('YYYY(MM,DD')), NAME, to_char(DATE, '(YYYY)MM,DD'), CITY || ', (UK)', CITY || ', US''s CITY', CITY || ', UK'";

String[] expected = new String[]{
"to_char(DATE, 'YYYY,MM,DD')", 
"'I am sad :('",
"to_char(DATE, ('YYYY(MM,DD)'))", // brackets within quotes within brackets
"to_char(DATE, ('YYYY,MM,DD)'))", // missing open bracket in quotes
"to_char(DATE, ('YYYY(MM,DD'))", // missing close bracket in quotes
"NAME", 
"to_char(DATE, '(YYYY)MM,DD')", 
"CITY || ', (UK)'", 
"CITY || ', US''s CITY'", // escape a single quote in quotes
"CITY || ', UK'"
};

String[] result = splitElements(source);
assert expected.equals(result);
Run Code Online (Sandbox Code Playgroud)

当存在转义引号时,可以通过在引号外使用逗号分割来实现前2个要点

这在使用SQL进行操作时非常有用.例如拆分项目,追加,插入,添加项目等.

提前致谢.

Wil*_*ord 6

我知道它有点长但相当直接,只需跟踪多少个parens以及内部或外部的引号.

String[] splitElements(String source) {
    int parencount = 0;
    boolean q = false;
    List<String> l = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < source.length(); i++) {
        char c = source.charAt(i);
        switch (c) {
            case ',':
                if (!q && parencount == 0) {
                    l.add(sb.toString());
                    sb.setLength(0);
                } else {
                    sb.append(c);
                }
                break;

            case '(':
                if(!q) parencount++;
                sb.append(c);
                break;

            case ')':
                if(!q) parencount--;
                sb.append(c);
                break;

            case '\'':
                q = ! q;
                sb.append(c);
                break;

            default:
                sb.append(c);
                break;
        }
    }
    String last = sb.toString();
    l.add(last);
    String sa[] = l.toArray(new String[l.size()]);
    return sa;
}
Run Code Online (Sandbox Code Playgroud)

  • 不要使用`sb = new StringBuilder()`来重置构建器,只需调用`sb.setLength(0)`. (3认同)