web-dev-qa-db-ja.com

Groovyの複数行にわたる正規表現

次のような複数行の文字列があります。

END IF;

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

   END IF;

太字で部分をキャプチャしたいと思います(EXECUTEIMMEDIATEから次のセミコロンまですべてを意味します。

次の正規表現がありますが、複数の行で機能するように変更するにはどうすればよいですか?

(EXECUTE).*;
38
Omnipresent

(?m)は正規表現を複数行にします-文字列演算子の開始(^)と終了($)を使用できます:

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

(?s)-dotallフラグ-正規表現を改行と一致させます。 (ドット)演算子:

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

以下は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]
9

私は同じ質問をしました、そして他の2つの答えは私を正しい方向に向けました。この特定のケースでは、複数の行にまたがるパターンを使用できるようにする(およびグループを選択する)必要があります。つまり、ドットを改行文字にも一致させる必要があります。デフォルトの動作は改行と一致しません。そのため、dotall(s)フラグを使用する必要があります。

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

これは、Groovyパターンでフラグを指定する方法です。

さまざまなパターンとフラグをテストするために、 RegExr 非常に便利であることがわかりました。

7
Mike Demenok