Ich arbeite gerade an einem Parser für unsere internen Protokolldateien (generiert von log4php, log4net und log4j). Bis jetzt habe ich einen schönen regulären Ausdruck, um die Logs zu analysieren, bis auf ein nerviges Bit: Einige Log-Nachrichten erstrecken sich über mehrere Zeilen, die ich nicht richtig zuordnen kann. Die Regex ich jetzt habe, ist dies:Eine Protokolldatei mit regulären Ausdrücken analysieren
(?<date>\d{2}/\d{2}/\d{2})\s(?<time>\d{2}):\d{2}:\d{2}),\d{3})\s(?<message>.+)
Die Log-Format (die ich zum Testen der Parser verwenden), ist dies:
07/23/08 14:17:31,321 log
message
spanning
multiple
lines
07/23/08 14:17:31,321 log message on one line
Wenn ich den Parser jetzt laufen, bekomme ich nur die Zeile Das Protokoll beginnt. Wenn ich es so ändere, dass es sich über mehrere Zeilen erstreckt, erhalte ich nur ein Ergebnis (die gesamte Protokolldatei).
@samjudson: ""
Sie müssen in dem regulären Ausdruck, der die RegexOptions.Singleline Flagge passieren, so dass passt auf alle Zeichen, nicht nur auf alle Zeichen außer neue Zeilen (das ist die Standardeinstellung).
Ich habe das versucht, aber dann stimmt es mit der ganzen Datei überein. Ich habe auch versucht, die Nachrichtengruppe auf. +? (nicht gierig), aber dann stimmt es mit einem einzelnen Zeichen überein (was ich auch nicht suche).
Das Problem ist, dass das Muster für die Nachricht auch auf der Datumsgruppe übereinstimmt, also, wenn es nicht auf einer neuen Zeile bricht, geht es einfach weiter und weiter und weiter.
Ich benutze diese Regex für die Nachrichtengruppe jetzt. Es funktioniert, es sei denn, es gibt ein Muster in der Protokollnachricht, das mit dem Beginn der Protokollnachricht übereinstimmt.
(?<message>(.(?!\d{2}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2},\d{3}\s\[\d{4}\]))+)