Vim中正则表达式汇总

在windows系统下用notepad++ 处理文本时最长用的就是正则表达式了,但是在linux的vim中用正则表达式的时候和notepad++ 中是有所不同的。 这些区别也不能全都记住,每次用的时候在上网搜索严重影响效率。 所以把一些基本的知识点记录下来,遂成此文。

查找替换

vim 中正则表达式主要用在 查找替换 中。其语法如下
查找: /pattern
替换: [range]s/{pattern}/{string}/[flags]
例子:

:1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换
:10s/from/to/ 表示只在第10行搜索替换
:%s/from/to/ 表示在所有行中搜索替换
1,$s/from/to/ 同上

flags 有如下四个选项
c confirm,每次替换前询问;
e error, 不显示错误;
g globle,不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串;
i ignore,忽略大小写
这些选项可以合并使用,如cgi表示不区分大小写,整行替换,替换前询问

vim中的正则表达式

元字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
. 匹配任意字符
[abc] 匹配方括号中的任意一个字符,可用-表示字符范围。如[a-z0-9]匹配小写字母和数字
[^abc] 匹配除方括号中字符之外的任意字符
\d 匹配阿拉伯数字,等同于[0-9]
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
\x 匹配十六进制数字,等同于[0-9A-Fa-f]
\X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
\l 匹配[a-z]
\L 匹配[^a-z]
\u 匹配[A-Z]
\U 匹配[^A-Z]
\w 匹配单词字母,等同于[0-9A-Za-z_]
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
\t 匹配<TAB>字符
\s 匹配空白字符,等同于[\t]
\S 匹配非空白字符,等同于[^\t]

vim中表示数量的元字符

注意:下面除了 * 以外 其他都需要在前面加上 \

1
2
3
4
5
6
7
*  *  匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个

需转义的字符

1
2
3
4
5
6
\* 匹配* 字符
. 匹配. 字符
\/ 匹配 / 字符
\ 匹配 \ 字符
\[ 匹配 [ 字符
\] 匹配 ] 字符

替换变量

注意 : vim中替换变量需要在括号前面加上 \
在正则式中以\(\)括起来的正则表达式,在后面使用的时候可以用\1\2等变量来访问\(\)中的内容

多选一匹配

1
2
3
4
5
6
7
8
9
10
11
在一个查找模式中,"或" 运算符是 "\|"。例如:
/foo\|bar
这个命令匹配了 "foo" 或 "bar"。更多的抉择可以连在后面:
/one\|two\|three
匹配 "one","two" 或 "three"。
如要匹配其多次重复,那么整个抉择结构须置于 "\(" 和 "\)" 之间:
/\(foo\|bar\)\+
这个命令匹配 "foo","foobar","foofoo","barfoobar",等等。
再举个例子:
/end\(if\|while\|for\)
这个命令匹配 "endif","endwhile" 和 "endfor"。

vim中的特殊字符

回车
输入方式: ctrl+v+enter
回车在vim的输入方法是

​ 先按ctrl+v,得到^

​ 再按enter.得到^M

因此把全文件所有str换成str回车的语句是:
: % s/str/str^M/g

参考

Vim查找替换 & 正则表达式