регулярное выражение для нескольких строк в Groovy - PullRequest
36 голосов
/ 01 сентября 2009

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

END IF;

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

   END IF;

Я хочу выделить часть, выделенную жирным шрифтом (то есть все, от ВЫПОЛНИТЬ НЕМЕДЛЕННЫЙ до следующей точки с запятой.

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

(EXECUTE).*;

Ответы [ 3 ]

57 голосов
/ 01 сентября 2009

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

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

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

/(?s)(EXECUTE).*?;/
9 голосов
/ 02 сентября 2009

В 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]
7 голосов
/ 03 октября 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...