
Ich versuche, einen regulären Ausdruck zu erstellen, der nur die letzten beiden Zeilen ausgibt, die der Anfrage entsprechen. Ich habe eine Protokolldatei mit einigen Zeilen und möchte die letzten beiden Zeilen mit folgendem abfangen:
erste Zeile: „4bccf“ und „Media“
zweite Zeile: „Live“ und „4bccf“ und „my“
Ich habe dafür einen regulären Ausdruck erstellt:
((?=.*\b4bccf\b)(?=.*\bMedia\b)|(?=.*\bLive\b)(?=.*\b4bccf\b)(?=.*\bmy\b))
das funktioniert, aber es druckt alle Zeilen mit („4bccf“ und „Media“) + alle Zeilen mit („Live“ und „4bccf“ und „my“)
Ich möchte jeweils nur die letzte Zeile erhalten. Ist das mit nur einem regulären Ausdruck möglich?
Wenn Sie eine Idee haben, bin ich sehr interessiert. Danke
Antwort1
Hier ist ein komplexer regulärer Ausdruck (PCRE-Variante), der die Aufgabe erledigt, aber ich schlage vor, dass Sie ein Skript in Ihrer bevorzugten Skriptsprache schreiben. Das ist viel wartungsfreundlicher!
Notiz:Ich habe das /x
Flag verwendet, das Kommentare zulässt und keine Leerzeichen berücksichtigt. Das ist sehr nützlich für die Lesbarkeit ;-). Wenn Ihre Regex-Variante es nicht unterstützt, entfernen Sie alle Leerzeichen und Zeilenumbrüche.
^ # beginning of line
(?=.*\b4bccf\b) # lookahead, make sure we have 4bccf in the line
(?=.*\bMedia\b) # lookahead, make sure we have Media in the line
(.+) # group 1, the whole line
$ # end of line
(?= # lookahead, make sure we have after:
(?: # non capture group
(?! # negative lookahead, make we haven't after:
(?=.*\b4bccf\b) # lookahead, make sure we have 4bccf in the line
(?=.*\bMedia\b) # lookahead, make sure we have Media in the line
) # end lookahead
[\s\S] # any character, including linebreak
)* # end group, may appear 0 or more times
\z # end of file
) # end lookahead
| # OR
^ # same description as above for the other words to check
(?=.*\bLive\b)
(?=.*\b4bccf\b)
(?=.*\bmy\b)
(.+)
$
(?=
(?:
(?!
(?=.*\bLive\b)
(?=.*\b4bccf\b)
(?=.*\bmy\b)
)
[\s\S]
)*
\z
)