регулярное выражение содержит несколько вхождений и требует совпадения последних 2 строк

регулярное выражение содержит несколько вхождений и требует совпадения последних 2 строк

Я пытаюсь создать регулярное выражение для вывода только последних 2 строк, соответствующих запросу. У меня есть файл журнала с несколькими строками, и я хочу поймать последние 2 строки с помощью:

первая строка: "4bccf" и "Media"

вторая строка: "Live" и "4bccf" и "my"

Я создал для этого одно регулярное выражение: ((?=.*\b4bccf\b)(?=.*\bMedia\b)|(?=.*\bLive\b)(?=.*\b4bccf\b)(?=.*\bmy\b))

это работает, но печатает все строки с ("4bccf" и "Media") + все строки с ("Live" и "4bccf" и "my")

Я хотел бы получить только последнюю строку каждого. Возможно ли сделать это только в одном регулярном выражении?

Если у вас есть идея, мне очень интересно Спасибо

решение1

Вот сложное регулярное выражение (в духе PCRE), которое делает эту работу, но я предлагаю вам написать скрипт на вашем любимом языке сценариев. Он будет гораздо более удобным в поддержке!

Примечание:Я использовал /xфлаг, который разрешает комментарии и не учитывает пробелы, это очень полезно для удобства чтения ;-) . Если ваш вариант регулярного выражения не поддерживает это, удалите все пробелы и переносы строк.

^                                   # 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
  )

Демонстрация и объяснение

Связанный контент