正規表示式出現次數很少,需要最後兩行匹配

正規表示式出現次數很少,需要最後兩行匹配

我正在嘗試創建一個正則表達式來僅輸出匹配請求的最後兩行。我有一個日誌文件,上面有幾行,我想用以下命令捕獲最後兩行:

第一行:“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
  )

示範和解釋

相關內容