2016-12-09 4 views
1

以下のデータがログファイルにあります。 "Process Started"と "Process Completed"の2つのフレーズの間にある行を抽出します。ライン。C#の2つの文字列の間の行を抽出する正規表現

2016-11-28 12:18:59.5286 | 14 | Info | Process Started -ABC ***** 
.... 
.. 
2016-11-28 12:18:59.5286 | 14 | Info | Process Completed -ABC, Status: Failed*** 



2016-11-28 13:18:59.5286 | 14 | Info | Process Started -DEF 
.... 
.. 
2016-11-28 13:18:59.5286 | 14 | Info | Process Completed -DEF Status: Passed*** 

以下のRegExを使用していますが、特定の一致の行の先頭と末尾が抜けています。正規表現の上

Regex r = new Regex("^*?Process Started -"+process.Name+"(.*?)Process Completed: "+process.Name+".*?", RegexOptions.Singleline); 

この

Process Started -ABC ***** 
.... 
.. 
2016-11-28 12:18:59.5286 | 14 | Info | Process Completed 

のように戻っしかし、私はあなたがMultilineオプションを使用する必要があるだろうと、あなたがこのような何かを行うことができ、この

2016-11-28 12:18:59.5286 | 14 | Info | Process Started -ABC ***** 
.... 
.. 
2016-11-28 12:18:59.5286 | 14 | Info | Process Completed -ABC, Status: Failed*** 
+3

私は個人的にはこの場合正規表現を使用しません。私は行ごとに読んで、その行に「Process Started」と「Process name」が含まれているかどうかを評価します。そうであれば、 "Process Completed"と "Process name"が入っている行が表示されるまで、リストに行を追加します。 –

+0

@ blaze_125、もし私がこのオプションだけを残してしまう解決策が見つからなければ。私はRegExがもっと簡単で簡単だと思った。 – raj

答えて

2

近づいていますが、最終的に遅延量が問題になります。これは最小のものと一致しますが、この場合は何もありません。

Regex r = new Regex("[^\n]*?Process Started -" 
     + process.Name + "(.*?)Process Completed -" 
     + process.Name + "[^\n]*", RegexOptions.Singleline); 

変更は私が作った:あなたは

  • が最も重要で、 "処理完了" の後のコロンの代わりにダッシュを持っていた

    • :ここ

      は働くあなたの正規表現の改正だ[^\n]*は先頭と末尾で一致する改行を防止しますが、行の残りの部分を取得します

    追加情報:

    私はあなたのコードのコンテキストでこれを使用する予定かどうかはわかりませんが、あなたは、むしろある特定のプロセス名の場合よりも、そのようなすべてのセクションを抽出する必要がある場合は、することができますこの変化を一度にすべてをつかむ:

    Regex r = new Regex("[^\n]*?Process Started -(\w+)(.*?)Process Completed -\1[^\n]*", RegexOptions.Singleline); 
    

    \1(\w+)にマッチしたものは何でも、プロセス名の後方参照です。プロセス名ごとに1つの一致のコレクションが表示されます。

  • +0

    ありがとう@Brian Stephens、これは "Process Started -ABC"レコードでうまくいきますが、 "Process Started -DEF"の場合、出力はProcess Started -ABCからProcess Completed -DEFです。これは常にファイルの先頭から戻ります。 – raj

    +0

    @raj:はい、そうです。私は正規表現の始まりを修正して改行も一致させないようにしました。 –

    +0

    これは魅力のように働いています。ありがとう! – raj

    0

    のように必要:

    var reg = new Regex(@"^.*Process Started -ABC(.*)$(\n^.*$)*?\n(^.*Process Completed -ABC.*)$", 
            RegexOptions.Multiline); 
    

    しかし、それは一見醜いです。

    :@ blaze_125はコメントで示唆したように、あなたは最善の策は、おそらく行にで分割し、あなたが好きな何かができるで-間

    すべての行を StartedCompleted文字列を探して、次につかむ反復することですね
    var lines = str.Split('\n'); 
    
    var q = new Queue<string>(); 
    
    foreach (var l in lines) 
    { 
        q.Enqueue(l); 
        if (l.Contains("Process Completed")) // you could use a regex here if you want more 
                  // complex matching 
        { 
         string output; 
         while (q.Count > 0) 
         { 
          // your queue here would contain exactly one entry 
          output = q.Dequeue(); 
          Console.WriteLine(output); 
         } 
        } 
    } 
    
    関連する問題