
Я пытаюсь создать регулярное выражение для вывода только последних 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
)