一. 正则表达式
在vim
中正则表达式得到了十分广泛的应用。 最常用的/
和 :s
命令中,正则表达式都是不可或缺的。 下面对vim
中的正则表达式的一些难点进行说明。
关于magic
vim
中有个magic
的设定。设定方法为:
:set magic " 设置magic :set nomagic " 取消magic :h magic " 查看帮助
vim
毕竟是个编辑器,正则表达式中包含的大量元字符如果原封不动地引用(像perl
那样), 势必会给不懂正则表达式的人造成麻烦,比如 /foo(1)
命令, 大多数人都用它来查找foo(1)
这个字符串, 但如果按照正则表达式来解释,被查找的对象就成了 foo1
了。
于是,vim
就规定,正则表达式的元字符必须用反斜杠进行转义才行, 如上面的例子,如果确实要用正则表达式,就应当写成/foo(1)
。 但是,像. *
这种极其常用的元字符,都加上反斜杠就太麻烦了。 而且,众口难调,有些人喜欢用正则表达式,有些人不喜欢用……
为了解决这个问题,vim
设置了 magic
这个东西。简单地说, magic
就是设置哪些元字符要加反斜杠哪些不用加的。 简单来说:
magic (m):除了$ . * ^ 之外其他元字符都要加反斜杠。
nomagic (M):除了 $ ^ 之外其他元字符都要加反斜杠。
m M
开关临时切换。 m
后面的正则表达式会按照 magic
处理,M
后面的正则表达式按照 nomagic
处理, 而忽略实际的magic
设置。
/m.* # 查找任意字符串
/M.* # 查找字符串 .* (点号后面跟个星号)
v
和 V
。v
(即 very magic
之意):任何元字符都不用加反斜杠V
(即 very nomagic
之意):任何元字符都必须加反斜杠例如:
/v(a.c){3}$ # 查找行尾的abcaccadc /m(a.c){3}$ # 查找行尾的(abc){3} /M(a.c){3}$ # 查找行尾的(a.c){3} /V(a.c){3}$ # 查找任意位置的(a.c){3}$
magic
,vim
也推荐大家都使用magic
的设置,在有特殊需要时,直接通过vmMV
即可。量词
本文下面使用的元字符都是magic
模式(除了$ . * ^
之外其他元字符都要加反斜杠)下的,在very magic
模式下,只需要将\
去掉即可.
vim | 意义 |
* | 匹配0个或多个(匹配优先) |
+ | 匹配1个或多个(匹配优先) |
? 或 = | 0个或1个(匹配优先),? 不能在?命令中使用 |
{n,m} | 匹配n个到m个, 如d{1, 3} 可以匹配1 到3 个数字,类似11 , 1 , 333 |
{n,} | 最少n 个(匹配优先) |
{,m} | 最多m 个(匹配优先) |
{n} | 恰好n 个 |
(123){2}
123123
.
一些常用的元字符
元字符 | 说明 |
---|---|
. |
匹配任意一个字符,如p*p 可以匹配字符串pep , pip 或者pcp |
[abc] |
匹配方括号中的任意一个字符。可以使用-表示字符范围 |
[a-z0-9] |
匹配小写字母和阿拉伯数字 |
[^abc] |
在方括号内开头使用^ 符号,表示匹配除方括号中字符之外的任意字符 |
d |
匹配阿拉伯数字,等同于[0-9] |
D |
匹配阿拉伯数字之外的任意字符,等同于[^0-9] |
x |
匹配十六进制数字,等同于[0-9A-Fa-f] |
w |
匹配单词字母,等同于[0-9A-Za-z_] |
W |
匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_] |
|
匹配<TAB> 字符 |
s |
匹配空白字符,等同于[ ] |
S |
匹配非空白字符,等同于[^ ] |
a |
所有的字母字符. 等同于[a-zA-Z] |
l |
小写字母[a-z] |
L |
非小写字母[^a-z] |
u |
大写字母 [A-Z] |
U |
非大写字幕[^A-Z] |
元字符的转义:
*
匹配 *
字符.
匹配 .
字符/
匹配 /
字符\
匹配
字符[
匹配 [
字符
表示位置的符号
位置元字符 | 含义 |
---|---|
$ |
匹配行尾,如here:$ 只会匹配出位于一行结尾的here: . |
^ |
匹配行首,如^Part 只会匹配出位于一行开头的Part . |
< > |
会匹配出以某些字符开头的(< )或结尾(> )的单词.<ac 只会匹配出以ac 开头的单词,如action ,而ac>/ 只会匹配出以ac 结尾的单词,如maniac .<action> 会匹配出action 这个单词.单词的开头和结尾,是用标点符号或空格来分隔的. |
替换变量
在正规表达式中使用(
和 )
符号括起正规表达式,即可在后面使用1
、2
等变量来访问 (
和 )
中的内容。这种形式实际上是将(
与)
中的模式保存到了特殊的空间(称之为"保留缓冲区").这种方法可以保存任意一行中的9
个模式.举个例子,对于下面的模式:
(That) or (this)
That
存放到缓冲区1
中,而将this
保存到保留缓冲区2
中,这些保留的模式在以后可以用1
到9
的序列重新排列,例如,如果要将That or this
改成this or That
,可以键入:
:%s/(That) or (this)/2 or 1/
:%s(abcd)1/alphabet-soup/
可以将
abcdabcd
替换为alphabet-soup
.这里需要特别注意一下,