2017-05-18 1 views
0

ich mit einem regex habe Schwierigkeiten von unten Textregex mit mehrzeilige und Gruppierung in C#

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! 

Ich möchte eine Ausgabe wie folgt anzupassen und eine Gruppierung

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! 

bisher machen i kam mit der folgenden Regex, die funktioniert, aber es zeigt mir nur die erste Zeile. Ich bin nicht in der Lage, die Regex, die für mehrere Zeilen arbeiten kann, zu bekommen.

RegexMuster was ich unitl jetzt versucht:

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

Ich bin kein Experte mit einem regex ich hoffe jemand kann mich aufklären besser RegexMuster zu machen.

+0

Könnten Sie bitte genauer gesagt über Filterung und Gruppierung? Wie ich sehen kann, starten Sie eine neue Gruppe für die neue * Sequenz * z. 'Sequenz Nr. 1456', 'Sequenz Nr. 1356'. Sie filtern alle * Warnungen * aus. Aber warum überspringen Sie einige * Fehler *, z. '30T1 Fehler" 10 "FS130 Maschine funktioniert nicht mehr? –

+0

@DmitryBychenko Diese Information ist nicht notwendig für mich, deshalb überspringe ich das. Das einzige, was ich jetzt brauche, ist der Regex, der mir die gewünschte Ausgabe wie oben geben kann. – user1521171

+0

Ich sehe, aber um den Regex zu schreiben/zu ändern, müssen wir wissen, was * enthalten * und was * auszuschließen *. –

Antwort

1

vorschlagen IEnumerable<string> und Linq statt regulären Ausdrücken

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)); 
    } 
} 

Test:

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); 

Ergebnis:

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! 

Ich denke, man actuall y Arbeit mit log Datei, in diesem Fall:

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

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

Danke für den Code, aber es gibt ein Problem in der Zeile 'Console.Write (string.Join (Environment.NewLine, gefiltert));' Es gibt mir einen Fehler Überladene Methodenübereinstimmung für Zeichenfolge hat ungültige Argumente. Ich habe die Zeile auskommen lassen und Haltepunkt in make report method machen, aber der Programmzeiger geht nie in diese Methode. Was stimmt nicht mit dem Code, den ich nicht verstanden habe? – user1521171

+0

@ user152117: Es funktioniert auf meiner Workstation, aber lassen Sie uns loswerden 'string.Join' und setzen Sie es als' foreach'; Bitte, siehe meine Bearbeitung. –

+0

das funktioniert. Aber ich habe noch eine Frage. 1. Ich hatte angenommen, dass Regex funktioniert, weil ich direkt mit der Datenbank arbeite. Ich hatte gehofft, dass ich die Daten direkt mit regex aus der Datenbank holen kann. Haben Sie einen besseren Vorschlag zu diesem Thema? – user1521171