40

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

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).*;
4

3 に答える 3

75

(?m)は正規表現を複数行にします-文字列演算子の開始(^)と終了($)を一致させることができます(この場合、文字列全体ではなく、個々の行の開始と終了を一致させます):

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

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

/(?s)(EXECUTE).*?;/
于 2009-09-01T17:41:11.630 に答える
10

以下は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-01T20:09:58.333 に答える
8

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

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

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

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

于 2012-10-03T05:05:44.457 に答える