vim: 隣接する行にないパターンを含む行を見つける

vim: 隣接する行にないパターンを含む行を見つける

特定のパターンを含むすべての行を表示する方法を見つけたいのですが、隣接する行 (前の行、次の行) は表示されません。

例えば、パターンは「PATTERN」という単語だとします。

1.#########################

2.#########パターン#########

3.##############################

2行目が有効になり、表示されます。

しかし

1.#########################

2.#########パターン#########

3.#########パターン#########

4.##############################

2行目と3行目は無効なので表示されません

答え1

次のように正規表現キャプチャ グループを使用します。

/\v%(PATTERN.*\n.*)@<!(PATTERN)%(.*\n.*\1)@!

例

恐ろしく見えるかもしれませんが、実は非常に簡単です。

  1. \v有効にするために使用されます「とても魔法のよう」正規表現(ほとんどの特殊文字にバックスラッシュの使用を避ける)
  2. PATTERN.*\n.*PATTERN、その後に任意の文字、改行文字、そして再び任意の文字が続く
  3. (...)@<!否定的な後読みのパターンです。つまり、欲しくない括弧の中に何があるかです。つまり、私たちの場合、ステップのすべては2存在しないはずです
  4. (PATTERN)これは実際の単語です。これは存在するはずです。将来の使用に備えて中括弧で囲みます。
  5. .*\n.*\1は何でも、改行、また何でも、そしてキャプチャしたグループ(ステップを参照4
  6. %(...)@!は否定的な先読みであり、前と同様に、中括弧内の内容は存在させたくないのです。

つまり、基本的にはPATTERN次のようになります。

  • を含む行が先行しないPATTERN
  • 次の行が続いていないPATTERN

関連情報