Как сказал Бобинс, регулярные выражения, вероятно, не будут достаточно мощными, чтобы сделать это. Они, конечно, не будут достаточно мощными, чтобы делать это в любой элегантной манере. Вторая ссылка, предоставленная cdonner, также не решает эту проблему; большинство ответов там пытались отговорить спрашивающего от выполнения этого без точек с запятой; если бы он принял общий совет, он бы оказался там, где вы находитесь.
Я думаю, что самый быстрый путь к решению этой проблемы - функция строкового сканера, которая проверяет каждый символ строки в последовательности и реагирует, основываясь на некотором сохраненном состоянии. Грубый псевдокод:
- Читать в символе
- Если символ не особенный, ПРОДОЛЖИТЬ
- Если символ экранирован (проверка, вероятно, требует проверки предыдущего символа), ПРОДОЛЖИТЬ
- Если символ начинает новую строку или заканчивает существующую, переключите флаг IN_STRING (вам может понадобиться несколько флагов для разных типов строк ... Я честно пытался и преуспел, оставаясь в неведении о мелочах цитирования SQL / бежать) и ПРОДОЛЖИТЬ
- Если символ является точкой с запятой И мы в настоящее время не в строке, мы нашли запрос! ВЫХОДИТЕ и ПРОДОЛЖИТЕ сканирование до конца строки.
Синтаксический анализ языков не входит в мои области опыта, поэтому вам следует тщательно рассмотреть этот подход; тем не менее, это будет быстро (со строками в стиле C, ни один из этих шагов совсем не дорогой, за исключением, возможно, для OUTPUT, в зависимости от того, что означает «вывод» в вашем контексте), и я думаю, что он должен выполнить работу.