Вот краткий код, который намекает на то, как вы можете решить эту проблему.Он использует сопоставление регулярных выражений со следующим шаблоном:
FROM\s+(\S+)|JOIN\s+(\S+)|INSERT\s+INTO\s+(\S+)
Целью здесь является захват имен таблиц всякий раз, когда они встречаются в операторах выбора (после FROM
и JOIN
) или в операторах вставки (послеINSERT INTO
).Обратите внимание, что в паттерне используется чередование с тремя группами захвата.
String query = "SELECT a.col1, b.col2 FROM tableA a INNER JOIN tableB b ";
query += "ON a.key = b.key; INSERT INTO tableC (col1) VALUES ('hello')";
String pattern = "FROM\\s+(\\S+)|JOIN\\s+(\\S+)|INSERT\\s+INTO\\s+(\\S+)";
Pattern r = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher m = r.matcher(query);
while (m.find()) {
String match = m.group(1) != null ? m.group(1) :
(m.group(2) != null ? m.group(2) : m.group(3));
System.out.println(match);
}
tableA
tableB
tableC
Демонстрация
Очевидно, что существует множество краевых случаев, которые я мог пропустить,В общем, для полного решения вам, возможно, придется написать реальный анализатор SQL.Для простых запросов выбора и вставки это может быть хорошей отправной точкой.