
リクエストに一致する最後の 2 行のみを出力する正規表現を作成しようとしています。数行のログ ファイルがあり、次のコードを使用して最後の 2 行をキャッチしたいと考えています。
最初の行: "4bccf" と "Media"
2行目:「Live」と「4bccf」と「my」
そのために 1 つの正規表現を作成しました:
((?=.*\b4bccf\b)(?=.*\bMedia\b)|(?=.*\bLive\b)(?=.*\b4bccf\b)(?=.*\bmy\b))
これは動作しますが、("4bccf" および "Media") を含むすべての行と ("Live" および "4bccf" および "my") を含むすべての行が印刷されます。
それぞれの最後の行だけを取得したいのですが、 1 つの正規表現だけでそれを行うことは可能ですか?
アイデアがあれば、とても興味があります。ありがとうございます
答え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
)