是否可以使用以下条件拆分字符串?
- 拆分,(即逗号)
- 在每个元素上,忽略在第一个'和最后一个'内查看逗号
- 在每个元素上,忽略在第一个(和最后一个)内检查逗号
例如
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进行操作时非常有用.例如拆分项目,追加,插入,添加项目等.
提前致谢.
我知道它有点长但相当直接,只需跟踪多少个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)