Вот наивный парсер, который может быть тем, что вы ищете. Я думал об использовании регулярного выражения. Сначала я думал, что твой язык на самом деле не обычный.
Я полагаю, что DML - это язык без контекста, но на самом деле ваш целевой язык является регулярным, потому что вам нет дела до вложенных операторов. Все, что вам нужно, это обнаружение строк верхнего уровня. Но даже это становится сложным в использовании регулярных выражений, если вы считаете, что внутри ваших вариантов могут быть экранированные кавычки. то есть 'abcd \' efg ', если у вас есть несколько; внутри varchar.
Этот код не очень красивый, но он должен делать то, что вы ищете.
public static void main(String[] ar) {
String s = "aaa 'bb;bb;bb' aaa; aaa 'bb;bb\\';bb' aaa";
System.out.println(splitStatments(s, ';'));
}
private static List<String> splitStatments(String s, char statementDelimiter) {
List<String> statements = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
boolean outsideString = true;
char lastChar = 0;
for (char c : s.toCharArray()) {
// in the case of the escaped \', we DON'T want to flip the boolean
if (c == '\'' && lastChar != '\\') {
outsideString = !outsideString;
}
if (c == statementDelimiter && outsideString) {
statements.add(sb.toString());
sb = new StringBuffer();
} else {
sb.append(c);
}
lastChar = c;
}
if (sb.length() > 0) {
statements.add(sb.toString());
}
return statements;
}