1

ストアドプロシージャファイルで呼び出されたストアドプロシージャの名前をすべて見つけようとしています。有効なストアドプロシージャの呼び出しは次のとおりです。

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」と等しくありませんが、この条件の正規表現をフレーム化する方法を完全に理解することはできません。

どんな助けでも大歓迎です。

4

2 に答える 2

3

行頭アンカーを^使用するだけです。また、

  • すでに を指定している場合は、callとの両方を含める必要はありません。CALLIgnoreCase
  • 行の最初のトークンでなければならないと仮定するとcall、後読みをスキップできます
  • ピリオドは既に文字クラスにあるため、エスケープする必要はありません
  • proc 名に一致する部分に名前を付けて、Match.Groups プロパティを使用して取得できます
string pattern = @"^\s*call\s*(?<ProcName>[A-Za-z0-9_.]+)(\s*)\(";
var rx = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase);
foreach(var m in rx.Matches(yourInput))
    Console.WriteLine(m.Groups["ProcName"].Value); 
于 2012-11-12T21:34:27.420 に答える
0

これは、あなたが望むことをするべき正規表現です。

^(?<!--.*?)\s*call\s+[A-Za-z0-9-_\.]+\s*\(

これは、サンプル テキストの最初の 5 つの呼び出しに一致します。

于 2012-11-12T21:34:48.820 に答える