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(其中也包含标签),而是开始逐行向下移动。

我哪里错了?感谢您的任何解释!


编辑:关于如何为这种查询创建多命令的后续操作在这里

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 回答