
对于前后端各种编程语言中的正则表达式,开发者们已经再熟悉不过了;但如果你在使用 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 次或多次\+匹配前面的字符 1 次或多次\?或\=匹配前面的字符 0 次或 1 次\{number}精确匹配指定次数\{min,max}匹配前面的字符最少 min 次或最多 max 次
非贪婪模式:
\{-}匹配前面的字符 0 次或多次,比如对于字符串 'This is a sample text':/h.\{-}s会匹配到 'his'/h.*s则匹配到 'his is a s'
\{-min,max}尽可能少地匹配 min 次到 max 次,也就是满足条件情况下能 min 尽量不 max
特殊字符
除了常见的 \s、\W 等,vim 中一些独特的字符匹配如下:
\a匹配字母,即[a-zA-Z]\A匹配非字母,即[^a-zA-Z]\l匹配小写字母,即[a-z]\L匹配非小写字母,即[^a-z]\u匹配大写字母,即[A-Z]\U匹配非大写字母,即[^A-Z]\x匹配十六进制字符,即[0-9a-fA-F]\X匹配非十六进制字符,即[^0-9a-fA-F]
多匹配和捕获模式
\|可以用来匹配两个或更多个关键词比如
/abc\|123会匹配到 'abc' 或 '123'
\(pattern\)可以建立捕获分组,在替换段落中则用\1,\2依次表示捕获到的分组
单词边界
\<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使得匹配特殊字符时不用\符号/V^.*$精确匹配字符串^.\*$
\c忽略大小写搜索\C大小写敏感搜索\%V只对可视模式下光标选中的范围进行替换s/\%Vcat/dog/g会把选中范围内的 'cat' 换成 'dog'在可视模式按 ESC 变为命令模式时,命令输入行会自动生成
'<,'>,要先删去这一部分
替换并改变大小写
在替换段落中,可以使用以下符号
\u将后面的一个字符变为大写:% s/\v(\a+)/\u\1/g会将文件中的所有英文单词变为首字母大写:% s/\v(\w)_(\a+)/\1\u\2/garray_sum变成 'arraySum'
\U将后面的所有字符变为大写:% s/\v(\a+)/\U\1/g会将文件中的所有英文单词变为全大写
\l将后面的一个字符变为小写\L将后面的所有字符变为小写
自定义分隔符
为了避免在搜索替换时使用过多的 / 所造成的混乱,可以使用诸如 #^$ 这样的其他符号替换 /,比如:
:% s#/project/adder/#/verilog/project/high_speed_adder/#g
参考资料
https://learnbyexample.gitbooks.io/vim-reference/content/Regular_Expressions.html

本文介绍了Vim编辑器中正则表达式的特殊语法,包括交互式替换、非贪婪模式、特殊字符匹配、多匹配与捕获模式等,并提供了多个实例演示。此外,还提到了搜索模式调整符如v用于简化匹配,并讲解了如何自定义分隔符以及在可视模式下的替换操作。对于熟悉正则和Vim的开发者,这篇文章将帮助他们更高效地使用Vim编辑器。
744

被折叠的 条评论
为什么被折叠?



