对于前后端各种编程语言中的正则表达式,开发者们已经再熟悉不过了;但如果你在使用 vim 编辑器,同样会在命令模式下遇到需要用正则实现搜索替换的情景。
往往在此时你会发现,这里的正则语法和 Javascript 等语言中虽然大部分相同,但还是有些差异,用起来处于一种 “会,但不完全会” 的奇怪叠加态。
今天我们就来稍微归纳一下 vim 中较独特的正则语法,为更好地使用这种编辑神器厘清障碍。
本文适用于较熟悉正则表达式和 vim 编辑器的读者,入门选手推荐先阅读以下文章:
搜索和替换标记
除了 g
、i
之外,在 vim 中还可以使用 c
,用来交互式地对匹配项逐个替换。
比如在命令模式下输入 :%s/cat/Dog/gc
后回车,会得到一个 replace with Dog (y/n/a/q/l/^E/^Y)?
的提示,按 y
就表示 yes 替换,按 n
表示 no 跳过等
贪婪模式和懒惰模式
贪婪模式:
非贪婪模式:
\{-}
匹配前面的字符 0 次或多次,比如对于字符串 'This is a sample text':
/h.\{-}s
会匹配到 'his'
/h.*s
则匹配到 'his is a s'
\{-min,max}
尽可能少地匹配 min 次到 max 次,也就是满足条件情况下能 min 尽量不 max
特殊字符
除了常见的 \s
、\W
等,vim 中一些独特的字符匹配如下:
多匹配和捕获模式
单词边界
\<pattern
匹配单词的开始边界
pattern\>
匹配单词的结束边界
\<pattern\>
精确匹配整个单词
搜索模式调整符
\v
用来简化限定符、分组等里面的 \
符号
/\vc{5}
精确匹配 'ccccc'
/\vabc+
匹配 'abc' 或 'abccc'
/\vabc?
匹配 'ab' 或 'abc'
/\v<his>
精确匹配整个单词 'his'
/\vmin|max
匹配 'min' 或 'max'
/\vhand(y|ful)
匹配 'handy' 或 'handful'
/\v(\a)\1
匹配 'aa' 'bb' 'cc' 等
s/\v(\d+) (\d+)/\2 \1/
将 '123 99' 替换为 '99 123'
\V
使得匹配特殊字符时不用 \
符号
-
\c
忽略大小写搜索
\C
大小写敏感搜索
\%V
只对可视模式下光标选中的范围进行替换
-
替换并改变大小写
在替换段落中,可以使用以下符号
\u
将后面的一个字符变为大写
-
\U
将后面的所有字符变为大写
-
\l
将后面的一个字符变为小写
\L
将后面的所有字符变为小写
自定义分隔符
为了避免在搜索替换时使用过多的 /
所造成的混乱,可以使用诸如 #^$
这样的其他符号替换 /
,比如:
参考资料