
我正在嘗試創建一個正則表達式來僅輸出匹配請求的最後兩行。我有一個日誌文件,上面有幾行,我想用以下命令捕獲最後兩行:
第一行:“4bccf”和“媒體”
第二行:“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
)