与正则表达式的结合
正则表达式绝对是计算机科学的一项伟大发明,在文本编辑、编写代码乃至文件批量重命名上,都能带来效率的极大提升。我们常用的 grep
命令的名称由来(Global search for Regular Expression and Print matching lines)就跟正则表达式息息相关,如果你经常使用 grep 却还没有掌握正则表达式,那就真是辜负了 grep 作者的用心良苦。
正则表达式的主要用法就是匹配字符,在 Vim 中主要体现在复杂字符串的查找与替换上,说几个用法:
-
搜索分组:
假如遇到这样的一堆文件名,想批量把日期格式yyMMdd
改成yy-dd-MM
咋办?161201.mp3 161202.mp3 161203.mp3 161206.mp3 161207.mp3 ...
直接上答案:
:%s/\(\d\d\)\(\d\d\)\(\d\d\)/\1\-\3\-\2
就变成了:
16-01-12.mp3 16-02-12.mp3 16-03-12.mp3 16-06-12.mp3 16-07-12.mp3 ...
这里用到了
()
分成 3 组,然后重新排序。因为都是特殊字符,所以用了很多\
,希望各位不要看晕了。 -
贪婪与非贪婪:
123abcdefc789
如上字符串,如果是
ab.*c
就是贪婪匹配,如果是ab.\{-}c
就是非贪婪。例如::s/ab.*c/456 // 结果是 ‘123456’ :s/ab.\{-}c/456 // 结果是 ‘123456defc789’
注:在 Vim 中非贪婪的用法是
.\{-}
而不是标准正则表达式中的.*?
,需要注意一下。 -
与或非:
/.*red\&.*blue // 匹配同时包含 red 与 blue 的一行 /abc\|123 // 匹配 abc 或者 123 :s/ab[^c]*/456 // 结果是 '123456cdefc789',即匹配所有不为 `c` 的字符,直到遇到第一个 `c` 为止。
-
反向肯定预查搜索:
/\(exp1\)\@<=exp2
即首先搜索 @<= 右侧的原子 exp2,遇到匹配项后再检查匹配结果左侧是否满足 exp1。1.000200 1.0002000300 :s/\(\.\d\+\)\@<=0\+\>//g // 结果是 ‘1.0002 1.00020003’
注:在 Vim 中匹配边界是
\>
而不是标准正则表达式中的\b
,需要注意一下。