Флаг DOTALL
позволяет .
соответствовать символам новой строки, но если вы просто примените его к существующему регулярному выражению, вы в конечном итоге сопоставите все от первого CREATE
до последнего ;
за один раз.Если вы хотите сопоставить утверждения по отдельности, вам нужно сделать больше.Одним из вариантов является использование не жадного квантификатора:
Pattern p = Pattern.compile("^CREATE\\b.+?;",
Pattern.DOTALL | Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
Я также использовал флаг MULTILINE
, чтобы привязка ^
соответствовала после новых строк, и CASE_INSENSITIVE
, потому что SQL - по крайней мерекаждый аромат, о котором я слышал.Обратите внимание, что все три флага имеют «встроенные» формы, которые вы можете использовать в самом регулярном выражении:
Pattern p = Pattern.compile("(?smi)^CREATE\\b.+?;");
(Встроенная форма DOTALL
по историческим причинам равна s
; она называлась «одно-строковый режим в Perl, там, где он возник.) Другой вариант - использовать класс символов с отрицанием:
Pattern p = Pattern.compile("(?mi)^CREATE\\b[^;]+;");
[^;]+
соответствует одному или нескольким символам, кроме ;
- включая новые строки,поэтому флаг s
не нужен.
До сих пор я предполагал, что каждый оператор начинается с начала строки и заканчивается точкой с запятой, как в вашем примере.Я не думаю, что что-то из этого требуется стандартом SQL, но я ожидаю, что вы узнаете, можете ли вы рассчитывать на них в этом случае.Возможно, вы захотите начать сопоставление с границы слова вместо границы строки:
Pattern p = Pattern.compile("(?i)\\bCREATE\\b[^;]+;");
Наконец, если вы думаете о том, чтобы сделать что-то более сложное с регулярными выражениями и SQL, не .Разбор SQL с помощью регулярных выражений - игра для дураков - она даже хуже, чем HTML и регулярные выражения.