regex poucas ocorrências e precisa da correspondência das últimas 2 linhas

regex poucas ocorrências e precisa da correspondência das últimas 2 linhas

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 /xflag 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
  )

Demonstração e explicação

informação relacionada