2017-05-18 11 views
0

私は、このような出力が一致し、今までグループ化正規表現は

30T1 Error: NIO from machine - sequence Nr. 1456 
30T1 Error: Failure from Stud machine point Nr. 100 
30T1 Error " 331" Stud Machine Failure: Motor not working! 

30T1 Error: NIO from machine - sequence Nr. 1356 
30T1 Error: Failure from Stud machine point Nr. 110 
30T1 Error " 332" Stud Machine Failure: current not available! 

をしたいと思いテキスト

30T1 Error: NIO from machine - sequence Nr. 1456 
30T1 Error: Failure from Stud machine point Nr. 100 
30T1 Warning: Stop at point not possible 
30T1 Error " 10" FS130 Machine stops working 
30T1 Error " 331" : Motor not working! 
30T1 Error " 331" Stud Machine Failure: Motor not working! 
30T1 Error " 331" Stud Machine Failure: Motor not working! 
30T1 Warning: " 11" FS130 working 
30T1 Error: NIO from machine - sequence Nr. 1356 
30T1 Warning: Stop at point not possible 
30T1 Error: Failure from Stud machine point Nr. 110 
30T1 Error " 331" Machine: not available! 
30T1 Error " 10" FS130 stops working 
30T1 Error " 332" Stud Machine Failure: current not available! 

以下から正規表現に苦しんでいますI動作している次の正規表現を思いついたが、それは私に最初の行だけを示す。私は複数の行のために働くことができる正規表現を得ることができません。

私は今unitlを試みたものを正規表現パターン:

(?<Error1>30T1\s+\w.+.?sequence\s+Nr.\s[0-9]+) 

私は、私は誰かがより良い正規表現パターンを作るために私を啓発することを願って正規表現と専門家ではありませんよ。

+0

あなたは、フィルタリングやグループ化についてより正確にしてくださいだろうか?私が見てきたように、新しい*シーケンス*の新しいグループを開始します。 'シーケンス番号。 1456 '、 '配列Nr。 1356。すべての*警告*を除外します。しかし、なぜあなたはいくつかのエラー*をスキップしますか? '30T1エラー" 10 "FS130マシンが動作を停止しますか?" –

+0

@DmitryBychenkoこの情報は私にとっては必要ないので、私はこれをスキップします。私が今必要とするのは、上記のように私に希望の出力を与えることができる正規表現だけです。 – user1521171

+0

私は見ていますが、正規表現を書く/修正するためには、*含めるべきものと*除外するものを知る必要があります。 –

答えて

1

は、LINQの代わりの正規表現IEnumerable<string>を使用することをお勧め

private static IEnumerable<string[]> ExtractLines(IEnumerable<string> source) { 
    List<string> group = new List<string>(); 

    foreach (var line in source) { 
    if (line.Contains("machine - sequence Nr.")) { 
     if (group.Any()) 
     yield return group.ToArray(); 

     group.Clear(); 
     group.Add(line); 
    } 
    else if (line.Contains("Stud machine point Nr.") || 
      line.Contains("Stud Machine Failure")) 
     if (!group.Contains(line)) // remove duplicates 
     group.Add(line); 
    } 

    if (group.Any()) 
    yield return group.ToArray(); 
} 

private static IEnumerable<String> MakeReport(IEnumerable<string> source) { 
    bool firstLine = true; 

    foreach (var group in ExtractLines(source)) { 
    if (!firstLine) 
     yield return ""; 

    firstLine = false; 

    yield return (string.Join(Environment.NewLine, group)); 
    } 
} 

テスト:

string text = 
@"30T1 Error: NIO from machine - sequence Nr. 1456 
30T1 Error: Failure from Stud machine point Nr. 100 
30T1 Warning: Stop at point not possible 
30T1 Error "" 10"" FS130 Machine stops working 
30T1 Error "" 331"" : Motor not working! 
30T1 Error "" 331"" Stud Machine Failure: Motor not working! 
30T1 Error "" 331"" Stud Machine Failure: Motor not working! 
30T1 Warning: "" 11"" FS130 working 
30T1 Error: NIO from machine - sequence Nr. 1356 
30T1 Warning: Stop at point not possible 
30T1 Error: Failure from Stud machine point Nr. 110 
30T1 Error "" 331"" Machine: not available! 
30T1 Error "" 10"" FS130 stops working 
30T1 Error "" 332"" Stud Machine Failure: current not available!"; 

... 

    var lines = text 
    .Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); 

    var filtered = MakeReport(lines); 

    foreach (var line in filtered) 
    Console.WriteLine(line); 

結果:

30T1 Error: NIO from machine - sequence Nr. 1456 
30T1 Error: Failure from Stud machine point Nr. 100 
30T1 Error " 331" Stud Machine Failure: Motor not working! 

30T1 Error: NIO from machine - sequence Nr. 1356 
30T1 Error: Failure from Stud machine point Nr. 110 
30T1 Error " 332" Stud Machine Failure: current not available! 

私はactuallあなたを推測しますこの場合、ログファイル、とyの仕事:

var filtered = MakeReport(File 
    .ReadLines(@"C:\MyLog.log")); 

    foreach (var line in filtered) 
    Console.WriteLine(line); 
+0

ありがとうございますが、行に1つの問題があります 'Console.Write(String.Join(Environment.NewLine、filtered)); ' stringのオーバーロードされたメソッドの一致に無効な引数があります。 私は行をコミットして、レポート作成メソッドでブレークポイントを作っていますが、プログラムポインタは決してそのメソッドには入りません。私が理解できなかったコードの何が間違っていますか? – user1521171

+0

@ user152117:私のワークステーションでは動作しますが、 'string.Join'を取り除いて' foreach'としましょう。私の編集を見てください。 –

+0

です。しかし、まだ私はいくつか質問があります。 1.データベースと直接作業しているので、正規表現が動作すると仮定していました。私はデータベースからregexを使って直接データを取得できることを願っていました。あなたはこの問題についてもっと良い提案をしますか? – user1521171