次のような複数行の文字列があります。
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).*;
(?m)は正規表現を複数行にします-文字列演算子の開始(^)と終了($)を使用できます:
/(?m)(EXECUTE).*?;/
(?s)-dotallフラグ-正規表現を改行と一致させます。 (ドット)演算子:
/(?s)(EXECUTE).*?;/
以下は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]
私は同じ質問をしました、そして他の2つの答えは私を正しい方向に向けました。この特定のケースでは、複数の行にまたがるパターンを使用できるようにする(およびグループを選択する)必要があります。つまり、ドットを改行文字にも一致させる必要があります。デフォルトの動作は改行と一致しません。そのため、dotall(s)フラグを使用する必要があります。
/(?s)(EXECUTE).*?;/
これは、Groovyパターンでフラグを指定する方法です。
さまざまなパターンとフラグをテストするために、 RegExr 非常に便利であることがわかりました。