Regulärer Ausdruck über mehrere Zeilen.

Die wilde Inge

Commander
Registriert
Aug. 2009
Beiträge
2.110
Hallo,

ich habe da mal eine Frage zur Machbarkeit. Ich versuche einen Regulären Ausdruck über mehrere Zeilen zu definieren, kriege das aber trotzdem umfänglichen Beispielen auf Google ehrlich gesagt nicht hin.

Ich habe eine Log Datei, in der steht oben im Kopf immer der Datumsstempel und weiter unten dann X Zeilen die immer nach dem gleichen Muster aufgebaut sind, mit einem Wort und zwei Zahlenwerten.

Ich habe einen RegEx für das Datum und einen RegEx für die Zahlenwerte und die funktionieren losgelöst von einander auch problemlos.

[^.]{38}[ ]([0-9]\/[0-9]\/[0-9]{4})[ ]([0-9]{2}:[0-9]{2}) für die Datumserkennung

^[\w]{5}[ ][\w]{2}[ ]([^ ]):[^.]{12}([0-9])[ ][\w][^.]{18}[ ]([0-9])[ ] für die Erkennung eines beliebigen Wortes an 3. Stelle des Satzes + 2 weitere Zahlenwerte.

Was ich mir jetzt aber vorstelle wäre, dass ich beides kombiniere und dann in Gruppe 1 und 2 Datum und Uhrzeit, und in Gruppe 3, 4 und 5 mein Wort und die beiden Zahlenwerte kriege.

Aktuell kriege ich nur das Wort und die Zahlen, womit sich aber kein Rückschluss auf das Datum ziehen lässt.

Geht das überhaupt?

VG


Code:
Bla Bla  status on Thu 11/5/2020 16:31

bla bla
bla

bla
bla bla

Users of bla:  (Total of 32 licenses issued;  Total of 0 licenses in use)
 
Statt [0-9] gibt es \d, das ist übersichtlicher.
Um einzelne Zeichen (Leerzeichen) brauchst du keine eckigen Klammern machen.

Hast du mal nach "regex newline" gesucht? da findet man doch Ergebnisse (\r\n|\r|\n).
Um welche Sprache geht es? Es scheint sinnvoller, Datetime Kandidaten validieren oder zumindest parsen zu lassen um auch bei Umstellung des Formates noch matchen zu können.
 
  • Gefällt mir
Reaktionen: Die wilde Inge
Hancock schrieb:
Hmm, online-Regex sagt, dasss auf dein Beispiel folgendes passt:
Code:
^.*status on \w{3} (\d{1,2}\/\d{1,2}\/\d{4} \d{2}:\d{2})(?:\r\n|\r|\n|.)*Users of \w*:\s+\(Total of (\d+) licenses issued;\s+Total of (\d+) licenses in use\)$

Der Hammer, danke.
Ich musste den RegEx noch etwas anpassen, weil die Gruppen nicht gepasst haben, aber das war natürlich nur ein paar Klicks.


^.status on \w{3} (\d{1,2}\/\d{1,2}\/\d{4}) (\d{2}:\d{2})(?:\r\n|\r|\n|.)*Users of (\w):\s+\(Total of (\d+) licenses issued;\s+Total of (\d+) licenses in use\)$

Danke noch mal!
Ergänzung ()

Hancock schrieb:
Hmm, online-Regex sagt, dasss auf dein Beispiel folgendes passt:
Code:
^.*status on \w{3} (\d{1,2}\/\d{1,2}\/\d{4} \d{2}:\d{2})(?:\r\n|\r|\n|.)*Users of \w*:\s+\(Total of (\d+) licenses issued;\s+Total of (\d+) licenses in use\)$

Stopp, hier stimmt doch was nicht. Jetzt kommt zum Tragen was ich befürchtet habe.

Mein Beispiel war leider falsch gewählt:

Code:
Bla Bla  status on Thu 11/5/2020 16:31

bla bla
bla

bla
bla bla

Users of bla:  (Total of 32 licenses issued;  Total of 0 licenses in use)

Users of bla2:  (Total of 22 licenses issued;  Total of 11 licenses in use)

Das ganze funktioniert ja nur einmalig, aber nicht mehrfach.
 
Zuletzt bearbeitet:
Ok, dann kommst du um einen zweiteiligen Regex nicht herum.
Code:
^.*status on \w{3} (\d{1,2}\/\d{1,2}\/\d{4} \d{2}:\d{2})$|^Users of \w*:\s+\(Total of (\d+) licenses issued;\s+Total of (\d+) licenses in use\)$
in Match 1 steht das Datum, in match 2 und 3 die user. Der erste Regex hat das Datum, der 2.,... hat dann die users.
 
Okay, danke für den Nachtrag. Dann ist es so wie ich es mir schon dachte, dass das nicht mehrfach klappt.
VG
 
Zurück
Oben