ストアドプロシージャファイルで呼び出されたストアドプロシージャの名前をすべて見つけようとしています。有効なストアドプロシージャの呼び出しは次のとおりです。
call my_stored_procedure(param1, param2)
[限られた正規表現の知識に基づく]私の戦略は、次のような一意のオカレンスを探すことです。call my_stored_procedure(
例外は、「呼び出し」の前の行の先頭に二重ダッシュの「-」コメントがあるものです。
私の考えでは、上記の文字列を取得したら、後処理で行う区切り文字として「call」と「(」を使用することで、実際のストアドプロシージャ名を見つけることができます。
ストアドプロシージャファイルには、この呼び出しのさまざまなバリエーションがあります。単語全体のそれぞれの間に複数のスペースやタブを置くことができます。
call my_stored_procedure(param1, param2)
call my_stored_procedure(param1, param2)
call my_stored_procedure (param1, param2)
call my_stored_procedure (
param1, param2)
call my_stored_procedure ( param1, param2 )
-- call my_stored_procedure (param1, param2)
--call my_stored_procedure (param1, param2)
--call my_stored_procedure
-- jsmith call my_stored_procedure (param1, param2)
私はASP.NetRegexエンジンを使用していますが、これまでのところ、これが私が持っているものです。
Regex rgxFindStoredProcedures = new Regex(@"(?<!.*--? *)(call|CALL)\s*([A-Za-z0-9-_\.]+)(\s*)\(",
RegexOptions.Multiline | RegexOptions.IgnoreCase);
上記の正規表現は機能しているようで、すべての一致を見つけて、最初の3つのコメントアウトされた呼び出しを除外します。ただし、最後にコメントされた呼び出しが含まれています。
-- jsmith call my_stored_procedure (param1, param2)
この最後にコメントアウトされた呼び出しをどのように除外できるかについて、誰かが考えていますか?私の考えは、内部に条件を入れることです
(?<!.*--? * some_condition_here)
--の後に単語がある場合、これは一致をドロップします。「call」と等しくありませんが、この条件の正規表現をフレーム化する方法を完全に理解することはできません。
どんな助けでも大歓迎です。