# Logdatei mit Regex auslesen



## -H-T-P- (4. Dezember 2014)

Hallo,

ich möchte eine Logdatei auslesen die ungefär so aussieht:

```
1 Text
2 Text
    Detailslkjflskdjflkjdglkjgfff
    läölgädflögädlög
3 Text
4 Text
    Detailsöälälgdfäglödf
    ölfkgödflgkdöllöd
    ödlgkdöflgk
```

Ein Eintrag besteht aus der Nummer, den dahinterstehenden Text und die optionalen Zeilen die drunter stehen.

Regex müsste mir jedes einzelne Element in einer Gruppe speichern, damit ich es später mit C# weiterverwenden kann.

Der Anfang könnte so aussehen:

```
(?<number>\d+)\s+(?<text>\w+)
```

Jetzt ist nur die Frage wie ich die optionalen Zeilen auslesen kann.

Könnt ihr mir weiterhelfen?


----------



## ComFreek (4. Dezember 2014)

Hallo,

ein "positive Lookahead" könnte funktionieren, siehe: http://www.regular-expressions.info/lookaround.html


----------



## -H-T-P- (4. Dezember 2014)

Das habe ich auch schon überlegt, aber da kann ich ja nur versuchen den nächsten Eintrag zu suchen; das funktioniert aber nicht beim Letzten.


----------



## ComFreek (4. Dezember 2014)

Folgendes funktioniert:

```
<?php

$str = <<< EOF
1 Test
Zeilen
2 Blub
Zeilen, Dateiende
EOF;

preg_match_all('/(\d)\s\w+[^\d]*((?=\d)|$)/', $str, $matches);
var_dump($matches);
```
Live: https://eval.in/230544


----------



## -H-T-P- (4. Dezember 2014)

Das hat mir schon weitergeholfen.

Muss leider zugeben, dass ich bei den Beispiel oben bisschen faul war.
Die Nummer ist ein Datum und die anderen Texte können auch Zahlen beinhalten.

Zum Beispiel:

```
01.01.2014 Das ist der 1.Test!$?
02.01.2014 Überschrift !$?
    Irgendein "komischer"
    Text mit Sonderzeichen und Zahlen 12345!
03.01.2014 Text
04.01.2014 Foo===
    Irgendein "komischer"
    Text mit Sonderzeichen und Zahlen 12345!
```

Folgendes Regex habe ich jetzt, was auch funktioniert:

```
(?<date>\d+.\d+.\d+.\d+)\s(?<title>.*?)\r(?<message>.*?)((?=(\d+.\d+.\d+.\d+))|$)
```

Wenn du eine elegantere Lösung kennst, immer her damit. ;-)

Ansonsten vielen Dank für deine Hilfe!


----------



## Spyke (7. Dezember 2014)

Ich hätte einfach die Datei Zeilenweise ausgelesen und geprüft ob die Zeile mit einem Datum beginnt.
Datum = Ja -> neue Gruppe
Datum = Nein -> gehört zur vorherigen Gruppe


----------

