in drools-util/src/main/java/org/drools/util/StringUtils.java [1041:1097]
private static List<String> codeAwareSplitOnChar(CharSequence string, boolean useAngularParenthesis, boolean trimArgs, char... chs) {
List<String> args = new ArrayList<>();
int lastStart = 0;
int nestedParam = 0;
boolean isSingleQuoted = false;
boolean isDoubleQuoted = false;
for (int i = 0; i < string.length(); i++) {
if (contains(chs, string.charAt( i ))) {
if (!isSingleQuoted && !isDoubleQuoted && nestedParam == 0) {
String arg = string.subSequence(lastStart, i).toString();
args.add(trimArgs ? arg.trim() : arg);
lastStart = i+1;
}
} else {
switch (string.charAt(i)) {
case '(':
case '[':
case '{':
if (!isSingleQuoted && !isDoubleQuoted) nestedParam++;
break;
case '<':
if (useAngularParenthesis && !isSingleQuoted && !isDoubleQuoted) nestedParam++;
break;
case ')':
case ']':
case '}':
if (!isSingleQuoted && !isDoubleQuoted) nestedParam--;
break;
case '>':
if (useAngularParenthesis && !isSingleQuoted && !isDoubleQuoted) nestedParam--;
break;
case '"':
if (!isSingleQuoted && (i == 0 || string.charAt(i-1) != '\\')) {
isDoubleQuoted = !isDoubleQuoted;
}
break;
case '\'':
if (!isDoubleQuoted && (i == 0 || string.charAt(i-1) != '\\')) {
isSingleQuoted = !isSingleQuoted;
}
break;
case '\\':
if (i+1 < string.length() && string.charAt(i+1) == '"') {
i++;
}
break;
}
}
}
String arg = string.subSequence(lastStart, string.length()).toString();
String lastArg = trimArgs ? arg.trim() : arg;
if (lastArg.length() > 0) {
args.add(lastArg);
}
return args;
}