Vim中的正则表达式
1 元字符对照表
Perl 元字符 | Vim 元字符 | 说明 |
---|---|---|
\ | \ | 元字符<—>普通字符 |
^ | ^ | 字符串的开始位置。vim中表示行首 |
$ | $ | 字符串的结束位置。vim中表示行尾巴 |
* | * | 零次或多次 |
+ | \+ | 一次或多次 |
? | \?或者\= | 零次或一次 |
{n} | \{n} | 匹配确定的 n 次 |
{n,} | \{n,} | 至少匹配n 次 |
{n,m} | \{n,m} | 最少匹配 n 次且最多匹配 m 次 |
? | \{-} \{-1,} \{-,1} | 跟在限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。vim中的三个相当于*? +? ?? |
. | . | 除换行符(\n、\r)之外的任何单个字符 |
(pattern) | 匹配 pattern 并获取这一匹配 | |
(?:pattern) | \%(atom) | 匹配 pattern 但不获取匹配结果 |
(?=pattern) | \(pattern\)\@= | 正向肯定预查,标注pattern前面 |
(?!pattern) | \(pattern\)\@! | 正向否定预查 |
(?<=pattern) | \(pattern\)\@< = | 反向肯定预查 |
(?<!pattern) | \(pattern\)\@<! | 反向否定预查 |
x|y | \| | 或者,注意优先级最低 |
[xyz] | [abc] | 匹配所包含的任意一个字符 |
[^xyz] | [^abc] | 匹配未包含的任意字符 |
[a-z] | 匹配指定范围内的任意字符 | |
[^a-z] | 匹配任何不在指定范围内的任意字符 | |
\b | \<和\> | 单词和空格间的位置。vim中的单词首和单词尾 |
\B | 匹配非单词边界 | |
\cx | 匹配由 x 指明的控制字符 | |
\d | \d | [0-9] |
\D | \D | [^0-9] |
\n | 换行符 | |
\r | 回车符 | |
\s | \s | 匹配空白字符,等价于 [ \f\n\r\t\v] |
\S | \S | 匹配非空白字符 |
\w | \w | [A-Za-z0-9_] |
\W | \W | [^A-Za-z0-9_] |
2 Vim中的4种模式
Vim中包括magic(默认)
和nomagic
两种模式
在magic
模式中,除了\ $ . * ^
五个元字符,其他元字符都需要加反斜杠,可以用\m
打开
在nomagic
模式中,除了\ $ ^
三个元字符,其他元字符都需要加反斜杠可以用\M
打开
此外,还有\v(very magic)
和\V(very nomagic)
两种模式
在very magic
模式中,所有的元字符都不用加反斜杠
在very nomagic
模式中,所有的元字符都需要加反斜杠
3 替换
在vim中,可以实用:[range]s/正则表达式/替换字符串/[option]
命令来替换文中的字符
在正则表达式中用\(\)
括起来的内容,可以在替换字符串中用\1
、\2
等引用
range
默认只在当前行中匹配
%
表示在所有行中匹配(相当于1,$)
1,10
表示从第1到第10行
.,$
代表从当前行到本文件的末尾
option
g(global)
表示全局匹配,否则只替换在行中匹配的第一个内容
c(comfirm)
表示每次替换前询问
y:确认执行这个替换将将所有Vim替换成vim;
n:取消这个本交Vim替换命令的操作;
a:执行本次所有替换字符串操作且不再询问;
q:退出当前vim字符串替换操作而不做任何改动;
l:替换完当前匹配点后退出(last)
i(ignorecase)
表示不区分大小写
n
表示忽略替换操作,只统计匹配到的数量
4 函数式
也可以使用:s/替换字符串/\=函数式
进行操作
在函数式中可以使用 submatch(1)
、submatch(2)
等来引用 \1
、\2
等的内容,而submatch(0)
可以引用匹配的整个内容。
:%s/\<id\>/\=line(".")
" 将各行的 id 字符串替换为行号
:%s/^\<\w\+\>/\=(line(".")-10) .".". submatch(1)
" 将每行开头的单词替换为 (行号-10).单词 的格式,
" 如第11行的 word 替换成 1. word