Ich möchte eine Log Datei einlesen lassen. Dazu muss ich mit split die einzelnen Log Einträge trennen.
Das funktioniert mit der Folgende Zeile auch sehr gut mit der Fehlernummer als trenner (Fehlernummer hat 4 oder mehr Ziffern).
Nun benötige ich aber auch die Fehlernummer, die ja bei dem Verfahren dann nicht mit in der Ausgabe auftaucht. Wie bekomme ich das hin das der Trenner auch mit in der Ausgabe landet.
In PHP gibt es ja das Flag PREG_SPLIT_DELIM_CAPTURE das angibt das auch klammerausdrücke aus dem Pattern mit übernommen werden, so etwas kann ich in Java aber nicht finden.
Die split Methode bietet so eine Möglichkeit leider nicht. Du könntest mit Matchern arbeiten:
Java:
importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassPatternExample{publicstaticvoidmain(String[] args ){finalPattern pattern =Pattern.compile("\\d{4}(.(?!\\d{4}))*",Pattern.DOTALL );finalString text ="1234 Meldung 47 bla 2345 noch ein Logeintrag 3456 Letzte Meldung";finalMatcher matcher = pattern.matcher( text );while( matcher.find()){System.out.println( matcher.group());}}}
Das (?! im Pattern ist ein negativer Lookahead. Das DOTALL brauchst du nur wenn Meldungen auch über mehrere Zeilen gehen können.
Ich sehe allerdings ein Problem bei denjenigen Logmeldungen, die Zahlen mit 4 Stellen oder mehr enthalten. Dort kannst du nicht unterscheiden ob eine Logmeldung anfängt oder die Zahl Teil einer Meldung ist (das Problem hast du beim split genau so). Wenn die 4-stelligen Zahlen immer am Anfang einer Zeile stehen kannst du das Pattern abändern zu:
Pattern.compile( "^\\d{4}(.(?!\\d{4}))*", Pattern.DOTALL | Pattern.MULTILINE );
Optimal wäre es, wenn jede Meldung in der Logdatei in einer eigenen Zeile steht. Dann würde es mehr Sinn machen die Datei Zeilenweise einzulesen und sich die Zeilen einzeln vorzunehmen.
Leider habe ich auf das Format der Log Datei keinen Einfluss. Jeder Log Eintrag kann theoretisch beliebig viele Zeilen umfassen.
ich habe jetzt eine Lösung gefunden indem ich den Ausdruck zum splitten zu einem Lookaround umgewandelt haben und damit anhand einer Position splitte anstatt einer Zeichenkette.