DOTALL
flaga pozwala na .
nowe linie meczu, ale jeśli po prostu zastosować go do istniejącej regex, będzie koniec dopasowywanie wszystkiego od pierwszego CREATE
do ostatniego ;
za jednym razem. Jeśli chcesz indywidualnie dopasować wyciągi, musisz zrobić więcej. Jedną z opcji jest użycie non-chciwy kwantyfikator:
Pattern p = Pattern.compile("^CREATE\\b.+?;",
Pattern.DOTALL | Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
użyłem również flagę MULTILINE
pozwolić meczu ^
kotwicy po nowej linii, a CASE_INSENSITIVE
ponieważ SQL jest - przynajmniej każdy smak Słyszałem . Zauważ, że wszystkie trzy flagi mają „wbudowane” formy, które można wykorzystać w regex samego:
Pattern p = Pattern.compile("(?smi)^CREATE\\b.+?;");
(Formularz inline z DOTALL
jest s
ze względów historycznych; nazwano tryb „single-Line” w Perl, . gdzie to pochodzi) Inną opcją jest użycie zanegowane klasę postaci:
Pattern p = Pattern.compile("(?mi)^CREATE\\b[^;]+;");
[^;]+
mecze jeden lub więcej charakteru wyjątkiem ;
--that zawiera znaki nowej linii, więc flaga s
nie jest potrzebne.
Do tej pory zakładałem, że każda instrukcja zaczyna się na początku wiersza i kończy się średnikiem, jak w twoim przykładzie. Nie sądzę, że żadna z tych rzeczy nie jest wymagana przez standard SQL, ale spodziewam się, że wiesz, czy możesz na nich liczyć w tym przypadku.Może chcesz rozpocząć dopasowanie na granicy słowa, a nie linia graniczna:
Pattern p = Pattern.compile("(?i)\\bCREATE\\b[^;]+;");
Wreszcie, jeśli myślisz o zrobieniu czegoś bardziej skomplikowanego z regexes i SQL, nie. Parsowanie SQL za pomocą wyrażenia regularnego jest grą głupca - jest to jeszcze gorsze dopasowanie niż HTML i wyrównywanie.