
Estou tentando criar um regex para gerar apenas as duas últimas linhas correspondentes à solicitação. Eu tenho um arquivo de log com poucas linhas e quero capturar as duas últimas linhas com:
primeira linha: "4bccf" e "Media"
segunda linha: "Live" e "4bccf" e "my"
Eu criei um regex para isso:
((?=.*\b4bccf\b)(?=.*\bMedia\b)|(?=.*\bLive\b)(?=.*\b4bccf\b)(?=.*\bmy\b))
isso funciona, mas imprime todas as linhas com ("4bccf" e "Media") + todas as linhas com ("Live" e "4bccf" e "my")
Eu gostaria de obter apenas a última linha de cada um. É possível fazer isso em apenas uma regex?
Se você tiver ideia, estou muito interessado. Obrigado
Responder1
Aqui está um regex complexo (tipo PCRE) que faz o trabalho, mas sugiro que você escreva um script em sua linguagem de script favorita. Será muito mais sustentável!
Observação:Usei o /x
flag que permite comentários e não cuida de espaços, é muito útil para facilitar a leitura ;-). Se o seu tipo de regex não suportar, remova todos os espaços e quebras de linha.
^ # 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
)