1

更新:この質問を簡単にするため。文字列を変更したので、BEGINENDについてまったく心配する必要はありません。代わりに、ターミネータとしてGOステートメントしかありません。私は今、他の人からいくつかの答えを得ることを願っています

DDLスクリプト(CREATE、ALTER、DROP)でINSERT、UPDATE、DELETEなどの非表示のDMLステートメントを検出できる正規表現を作成する必要があります。

例。以下のスクリプトでは、2つのdeletetable5ステートメントと最後のinsertintotable3ステートメントをキャッチする必要があります。ただし、実際にはストアドプロシージャ自体の本体にある挿入ステートメントは無視する必要があります。

ここでこの正規表現を実行すると:http://regexr.com?33rf3、90 を達成したことがわかります。動作していない唯一の部分は、最後のGOまで貪欲な試合を行っていることです。最初のGOで停止する必要があります。+を使ってみましたか?欲張りでないようにするための演算子ですが、動作したくありません。

delete table5 /*Regex should find this*/

GO

create proc abc
begin
    insert into table1  /*Regex should IGNORE this*/
    begin
        fake nesting here
        insert into table2 /*Regex should IGNORE this*/
    end
end

GO

delete table5 /*Regex should find this*/

GO

alter proc abc2
begin
  --no statements in this proc
end

GO

insert into table3 /*Regex should find this*/
4

1 に答える 1

2

GOステートメントは必要ありません。

        var regex1 = new Regex(@"
          (?s)
          (create|alter|drop).+?
          begin
            (?:
               (?> (?! begin | end ) .
                  | begin (?<counter>)
                  | end  (?<-counter>)
                )*
            )
            (?(counter)(?!))
          end
          "
        , RegexOptions.IgnorePatternWhitespace
        );

        var regex2 = new Regex(@"(?:insert|update|delete).+");

        var result = regex2.Matches(regex1.Replace(your_input, ""))
            .Cast<Match>()
            .Select(m => m.Value);

このコードは、すべてのcreate / alter / dropステートメントを削除し、delete / alter/dropを探します。正規表現を1つだけ使用して実行できると思いますが、今提案できるのはそれだけです。申し訳ありません:)

于 2013-02-20T23:11:24.947 に答える