Как сказал bobince, регулярные выражения, вероятно, не будут достаточно мощными, чтобы это сделать. Они, конечно, не будут достаточно сильными, чтобы сделать это на любой изящной элегантной манере. Вторая ссылка cdonner также не касается этого; большинство ответов там пытались выговорить вопросника из этого без точки с запятой; если бы он принял общий совет, тогда он оказался бы там, где вы есть.
Я думаю, что самый быстрый путь к решению этого вопроса будет состоять из функции строкового сканера, которая проверяет каждый символ строки в последовательности и реагирует на бит состояния. Грубый псевдокод:
- Читайте в характере
- Если символ не является специальным, ПРОДОЛЖИТЬ
- Если символ экранированы (проверить это, вероятно, требует рассмотрения предыдущего символа), ПРОДОЛЖИТЬ
- Если персонаж начнет новую строку или закончит существующую, переключит флаг IN_STRING (вам может понадобиться несколько флагов для разных типов строк ... Я честно пытался и преуспел в том, что остался не осведомленным о мелочах SQL-цитирования/экранирования) и CONTINUE
- Если символ является точкой с запятой A ND мы в настоящее время не являемся строкой, мы нашли запрос! OUTPUT it и CONTINUE до конца строки.
Язык синтаксического анализа не является ни одной из моих областей опыта, поэтому вы захотите внимательно рассмотреть этот подход; тем не менее, он будет быстрым (со строками C-стиля, ни один из этих шагов не будет стоить дорого, за исключением, возможно, OUTPUT, в зависимости от того, что означает «вывод» в вашем контексте), и я думаю, что он должен выполнить эту работу.
Я хотел бы пояснить, что я не хочу, чтобы закодировать регулярное выражение? Я не дурак. Зная, что операторы SQL разделены знаком «;», я считаю, что лучшим решением является написать регулярное выражение для разделения точки с запятой. Настоящая проблема заключается в совпадении точек с запятой, не включенных в одиночные или двойные кавычки. – 2009-03-18 14:04:43
Может быть как поле с двумя кавычками, так и одно кавычками s в той же строке с несколькими запросами? Может ли поле с двумя кавычками содержать неэксклюзивные одиночные кавычки или наоборот? В зависимости от ответов это может быть выполнимо. –
Дубликат: [http://stackoverflow.com/questions/139926/regular-expression-to-match-common-sql-syntax](http://stackoverflow.com/questions/139926/regular-expression-to-match -common-sql-синтаксис) [http://stackoverflow.com/questions/633014/split-multiple-sql-statements-into-individual-sql-statements](http://stackoverflow.com/questions/633014/ split-multiple-sql-statements-in-individual-sql-statements) – cdonner