2009-09-01 18 views
35

tengo una cadena de varias líneas como la siguiente:expresiones regulares a través de múltiples líneas en Groovy

END IF; 

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

    END IF; 

deseo de capturar la parte en negrita (que significa todo, desde EJECUTAR INMEDIATO al siguiente punto y coma

tengo el. ? (? m) siguiente expresión regular, pero ¿cómo puedo cambiar para que funcione con múltiples líneas

(EXECUTE).*; 

Respuesta

49

hace que la línea múltiple de expresiones regulares - le permite usar comienzo (^) y el final ($) de los operadores de cadena:

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

(? S) - dotall flag: hace que la expresión regular coincida con las líneas nuevas. (punto) operadores:

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

Lo siguiente debería funcionar en Groovy.

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

Tuve la misma pregunta y las otras dos respuestas me orientaron en la dirección correcta. En este caso particular, desea poder usar patrones (y seleccionar grupos) que abarcan varias líneas, es decir, desea que el punto también coincida con los caracteres de nueva línea. El comportamiento predeterminado no coincide con las nuevas líneas. Por eso es necesario utilizar el dotall (s) de la bandera:

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

Así es como se especifica en los patrones de banderas maravilloso.

Para probar diferentes patrones y banderas encontré RegExr bastante útil.

Cuestiones relacionadas