1

で終わるテキストの複数行のブロックをフィルタリングするための正しい正規表現は何#tagsですか?私のファイルは次のようになります。

Text block 1:
- something
- something
- something
#tag1 #tag2

Text block 2:
- somethingelse
- somethingelse
#tag2

Text block 3:
- really interesting stuff
- really interesting stuff
#tag1

etc

これらの すばらしいヒントは、を使用することを私に示しました\_.。したがって、を含む両方のブロックを除外するために#tag1、私はこれを思いついた:

\_.\{-}#tag1.*

ただし、これではテキストブロック1しか得られません。テキストブロック2(タグも含まれています)をさらに指す代わりに、カーソルが1行ずつ下に移動し始めます。

どこが間違っているのですか?説明ありがとうございます!


編集:この種のクエリのマルチコマンドを作成する方法のフォローアップはここにあります。

4

1 に答える 1

3

これは、ブロック内のすべての行を一致させたい場合に機能します(一致するブロック内のすべてのテキストをバッファーにヤンクするために使用します)

^\(.\+\n\)\{-}#.*tag1

だからあなたはすることができます

g/^\(.\+\n\)\{-}#.*tag1/d A

#tag1で終わるすべてのテキストブロックを削除するには(もちろん、代わりにヤンクする場合はdをyに変更します)、レジスタAにヤンクしてから、"apすべてを貼り付けます(または<C-r>a挿入モードで)

これにより、tag1を含むタグで終わる各ブロックの最初の行にジャンプできます。

\(\%^\|^\n\)\zs.\(.\+\n\)\{-}#.*tag1.*$

の問題

\_.\{-}#tag1.*

{-}を使用して欲張りでない場合でも、現在の行の下に#tag1がある行がある限り、常に一致します。_。*または_。{-}を使用すると、かなり危険な場合があります。たとえば、「テキストブロック2:」の行にいる場合です。

Text block 2:
- somethingelse
- somethingelse
#tag2

Text block 3:
- really interesting stuff
- really interesting stuff
#tag1

テキストブロック2からテキストブロック3の後の#tag1までの範囲全体で一致します。

代わりにあなたが持っていた場合

Text block 3:
- really interesting stuff
- really interesting stuff
#tag1

Text block 2:
- somethingelse
- somethingelse
#tag2

テキストブロック3の行のみを照合します。

于 2012-04-09T18:53:16.877 に答える