
Estoy intentando crear una expresión regular para generar solo las últimas 2 líneas que coincidan con la solicitud. Tengo un archivo de registro con algunas líneas y quiero capturar las últimas 2 líneas con:
primera línea: "4bccf" y "Media"
segunda línea: "Live" y "4bccf" y "my"
Creé una expresión regular para eso:
((?=.*\b4bccf\b)(?=.*\bMedia\b)|(?=.*\bLive\b)(?=.*\b4bccf\b)(?=.*\bmy\b))
eso funciona pero imprime todas las líneas con ("4bccf" y "Media") + todas las líneas con ("Live" y "4bccf" y "my")
Me gustaría obtener solo la última línea de cada uno. ¿Es posible hacer eso en una sola expresión regular?
Si tienes idea, estoy muy interesado. Gracias.
Respuesta1
Aquí hay una expresión regular compleja (tipo PCRE) que hace el trabajo, pero le sugiero que escriba un script en su lenguaje de scripting favorito. ¡Será mucho más fácil de mantener!
Nota:He usado la /x
bandera que permite comentarios y no ocupa espacios, es muy útil para la legibilidad ;-). Si su estilo de expresión regular no lo admite, elimine todos los espacios y saltos de línea.
^ # 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
)