Подтвердить что ты не робот

Regex по нескольким строкам в Groovy

У меня есть строка с несколькими строками, например:

END IF;

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

   END IF;

Я хочу выделить часть жирным шрифтом (что означает все, начиная с EXECUTE IMMEDIATE и заканчивая следующей точкой с запятой.

У меня есть следующее регулярное выражение, но как его изменить для работы с несколькими строками?

(EXECUTE).*;
4b9b3361

Ответ 1

(? m) делает многолистное выражение регулярным выражением - позволяет использовать начальные (^) и end ($) строковые операторы:

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

(? s) - флаг dotall - делает регулярное выражение совпадающим с символом новой строки. (точка):

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

Ответ 2

Следующее должно работать в 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]

Ответ 3

У меня был тот же вопрос, и два других ответчика указали мне правильное направление. В этом конкретном случае вы хотите иметь возможность использовать шаблоны (и выбирать группы), которые занимают несколько строк, т.е. вы хотите, чтобы точка также соответствовала символам новой строки. Поведение по умолчанию не соответствует символам новой строки. Вот почему вам нужно использовать флаг dotall (s):

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

Вот как вы указываете флаги в шаблонах.

Для тестирования различных шаблонов и флагов я нашел RegExr весьма полезным.