2009-09-01 13 views
35

Ich habe eine Zeichenfolge mehrzeilige wie folgt vor:regex über mehrere Zeilen in Groovy

END IF; 

EXECUTE IMMEDIATE ' CREATE INDEX #idx1 ON somename (row_id, something)'; 
    IF v_sys_error 0 THEN 
     GOTO SQL_ERROR; 

    END IF; 

Ich möchte das Teil in fett (was bedeutet, alles zu erfassen, von EXECUTE IMMEDIATE zum nächsten Semikolon

Ich habe die. ? (? m) folgende regex aber wie kann ich es ändern mit mehreren Linien zu arbeiten

(EXECUTE).*; 

Antwort

49

die Regex mehrzeilige macht - ermöglicht es Ihnen, Anfang (^) und Ende ($) von String-Operatoren zu verwenden:

(? S) - dotall flag - macht die Regex mit Zeilenumbrüchen übereinstimmen. (Punkt-) Operatoren:

/(?s)(EXECUTE).*?;/ 
8

Folgendes sollte in Groovy funktionieren.

def s = """ 
END IF; 

EXECUTE IMMEDIATE ' CREATE INDEX #idx1 
     ON somename (row_id, 
          something)'; 

    IF v_sys_error <> 0 THEN 
     GOTO SQL_ERROR; 

    END IF; 
""" 

def expect = """ 
EXECUTE IMMEDIATE ' CREATE INDEX #idx1 
     ON somename (row_id, 
          something)'; 
""".trim() 

def exe = s =~ /(?ms)(EXECUTE.*?;)/ 

assert expect == exe[0][1] 
4

Ich hatte die gleiche Frage und die anderen zwei Antworten zeigten mir in die richtige Richtung. In diesem speziellen Fall möchten Sie in der Lage sein, Muster zu verwenden (und Gruppen auszuwählen), die sich über mehrere Zeilen erstrecken, d. H. Sie möchten, dass der Punkt auch mit Zeilenvorschubzeichen übereinstimmt. Das Standardverhalten stimmt nicht mit Zeilenvorschüben überein. Deshalb sollten Sie die dotall (n) Flagge verwenden müssen:

/(?s)(EXECUTE).*?;/ 

Dies ist, wie Sie Fahnen in groovy Muster angeben.

Zum Testen verschiedener Muster und Flags fand ich RegExr ziemlich nützlich.

Verwandte Themen