在 vim 中使用 & 符号时如何删除 space 间隙

How to remove space gap when using & symbol in vim

我想在所有以"w"结尾的单词的末尾添加"caps"。 例如 "jaw" 应该变成 "jawcaps",而 "blow" 应该变成 "blowcaps"

下面的命令是使用正则表达式来达到上面的要求。

:%s/[A-Za-z][A-Za-z]*w[^A-Za-z]/&caps

但是当我使用上面的命令时 "jaw" 转换为 "jaw caps" 而不是 "jawcaps"

如何删除位于 "jaw" 和 "caps" 之间的 space?

您的正则表达式有问题,您的正则表达式会匹配值 w 后的非字符。在您的情况下,匹配 jaw[one space] 而不是 jaw

:%s/[A-Za-z][A-Za-z]*w[^A-Za-z]/&caps
                       ^^^ here match a space

我建议您使用捕获正则表达式。

:%s/\([A-Za-z][A-Za-z]*w\)\([^A-Za-z]\)/caps

更好的解决方案应该是使用 look behind

:%s/\w\w*w\w\@!/&caps

这个怎么样:

:%s/w\>\zs/caps/g

Sato Katsura 的回答 :%s/w\>\zs/caps/g 是这样的:

  1. 搜索每个 "w" 字符是单词最后一个字符的位置:/w\>.

  2. 但是不要匹配那个"w":只匹配"w"之后的零宽度space:/w\>\zs(或者/w\zs\>).

  3. 用单词 "caps" 替换匹配项:s/w\>\zs/caps/.

  4. 在每一行上这样做:范围是 %,并且在这些行上的每一次出现:标志是 g.

放在一起::%s/w\>\zs/caps/g

  • 匹配词结束:h /\>
  • 设置比赛开始:h \zs
  • 替换命令:h :s
  • 范围规范:h :range
  • 替换标志 :h :s_flags