regex sur plusieurs lignes dans Groovy

j'ai une chaîne de caractères multiple comme suit:

END IF;

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

   END IF;

je souhaite capturer la partie en gras (ce qui signifie tout de L'exécution immédiate au prochain point-virgule.

j'ai le regex suivant mais comment puis-je le changer pour travailler avec plusieurs lignes?

(EXECUTE).*;
36
demandé sur Phrancis 2009-09-01 21:21:53

3 réponses

(?m) rend le regex multiline - vous permet d'utiliser le début ( ^ ) et la fin ( $ ) des opérateurs de chaîne:

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

(?s) - drapeau dotall-rend le regex match newlines avec . (dot) opérateurs:

/(?s)(EXECUTE).*?;/
52
répondu Nosrama 2012-10-03 04:52:41

ce qui suit devrait fonctionner à 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]
8
répondu John Wagenleitner 2009-09-01 20:09:58

j'avais la même question et les deux autres réponses m'ont indiqué la bonne direction. Dans ce cas particulier, vous voulez pouvoir utiliser des motifs (et sélectionner des groupes) qui couvrent plusieurs lignes, c'est-à-dire que vous voulez que le point corresponde aussi aux caractères newline. Le comportement par défaut ne correspond pas à newlines. C'est pourquoi vous devez utiliser la dotall (s) drapeau:

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

voici comment vous spécifiez les drapeaux dans groovy patterns.

pour tester différents modèles et drapeaux que j'ai trouvé RegExr tout à fait utile.

6
répondu Mike Demenok 2012-10-03 05:05:44