Question

regex over multiple lines in Groovy

I have a multiple line string like following:

END IF;

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

   END IF;

I wish to capture the part in bold (meaning everything from EXECUTE IMMEDIATE to next semicolon.

I have the following regex but how can I change it to work with multiple lines?

(EXECUTE).*;
 45  31332  45
1 Jan 1970

Solution

 82

(?m) makes the regex multiline - allows you to match beginning (^) and end ($) of string operators (in this case, to match the beginnings and ends of individual lines, rather than the whole string):

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

(?s) - dotall flag - makes the regex match newlines with . (dot) operators:

/(?s)(EXECUTE).*?;/
2009-09-01

Solution

 10

The following should work in 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]
2009-09-01