La bandiera DOTALL
lascia i .
partita ritorni a capo, ma se semplicemente applicare al vostro regex esistente, vi ritroverete fino ad abbinare tutto, dal primo CREATE
all'ultimo ;
in una volta. Se vuoi abbinare le dichiarazioni individualmente, dovrai fare di più. Una possibilità è quella di utilizzare un quantificatore non avido:
Pattern p = Pattern.compile("^CREATE\\b.+?;",
Pattern.DOTALL | Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
ho usato anche la bandiera MULTILINE
di lasciare che il match ^
ancoraggio dopo a capo, e CASE_INSENSITIVE
perché SQL è - almeno, ogni sapore ho sentito di . Da notare che tutte e tre le bandiere hanno forme "in linea" che è possibile utilizzare nella regex stesso:
Pattern p = Pattern.compile("(?smi)^CREATE\\b.+?;");
(La forma in linea di DOTALL
è s
per ragioni storiche, è stato chiamato in modalità "single-line" in Perl, . dove ha avuto origine) Un'altra opzione è quella di utilizzare una classe di caratteri negata:
Pattern p = Pattern.compile("(?mi)^CREATE\\b[^;]+;");
[^;]+
corrisponde a uno o più di qualsiasi carattere tranne ;
--that include nuove linee, per cui non è necessaria la bandiera s
.
Finora, ho assunto che ogni istruzione inizi all'inizio di una riga e termini con un punto e virgola, come nel tuo esempio. Non penso che nessuna di queste cose sia richiesta dallo standard SQL, ma prevedo che saprai se puoi contare su di esse in questa istanza.Si potrebbe desiderare di iniziare corrispondenti ad un confine di parola, invece di una linea di confine:
Pattern p = Pattern.compile("(?i)\\bCREATE\\b[^;]+;");
Infine, se stai pensando di fare qualcosa di più complicato con le regex e SQL, no. L'analisi di SQL con regex è un gioco da pazzi: è un adattamento ancora peggiore rispetto all'HTML e alle regex.