vim正则关键字
在 Vim 中,正则表达式(Regular Expressions)非常强大,但其语法与常见的 Perl 或 Python 正则略有不同。Vim 的正则关键字(元字符)根据是否开启“魔术”模式(magic mode)而有所变化。
默认情况下,Vim 使用 magic 模式(即 :set magic,这是默认设置)。在此模式下,部分字符具有特殊含义,而其他字符需要加 \ 转义才具有特殊含义。
以下是 Vim 正则表达式中常用的关键字和元字符分类总结:
1. 锚点 (Anchors)
用于匹配位置而非字符。
| 关键字 | 含义 | 示例 |
|---|---|---|
^ |
匹配行首 | ^start 匹配以 "start" 开头的行 |
$ |
匹配行尾 | end$ 匹配以 "end" 结尾的行 |
\< |
匹配单词开头 | \<foo 匹配 "foobar" 中的 "foo",不匹配 "barfoo" |
\> |
匹配单词结尾 | foo\> 匹配 "barfoo" 中的 "foo",不匹配 "foobar" |
\%5l |
匹配第 5 行 | 特定行号匹配 |
\%5c |
匹配第 5 列 | 特定列号匹配 |
2. 字符类 (Character Classes)
| 关键字 | 含义 | 等价范围 |
|---|---|---|
. |
匹配任意单个字符(除换行符外) | |
\d |
匹配数字 | [0-9] |
\D |
匹配非数字 | [^0-9] |
\s |
匹配空白字符(空格、Tab等) | [ \t] |
\S |
匹配非空白字符 | [^ \t] |
\w |
匹配单词字符(字母、数字、下划线) | [a-zA-Z0-9_] |
\W |
匹配非单词字符 | [^a-zA-Z0-9_] |
\x |
匹配十六进制数字 | [0-9a-fA-F] |
\o |
匹配八进制数字 | [0-7] |
\a |
匹配字母 | [a-zA-Z] |
\l |
匹配小写字母 | [a-z] |
\u |
匹配大写字母 | [A-Z] |
自定义字符组:
[abc]:匹配 a、b 或 c 中的任意一个。[^abc]:匹配除了 a、b、c 之外的任意字符。[a-z]:匹配范围内的字符。[:alnum:]:POSIX 字符类,需在括号内使用,如[[:alnum:]]。
3. 数量限定符 (Quantifiers)
在 magic 模式下,这些符号通常需要加 \ 才能表示数量含义(这与很多其他正则引擎相反,其他引擎通常默认 + ? 有特殊含义,而 Vim 默认它们是普通字符)。
| 关键字 | 含义 | 示例 |
|---|---|---|
* |
匹配前一项 0 次或多次 | ab*c 匹配 "ac", "abc", "abbc" |
\+ |
匹配前一项 1 次或多次 | ab\+c 匹配 "abc", "abbc" (不匹配 "ac") |
\= |
匹配前一项 0 次或 1 次 | ab\=c 匹配 "ac", "abc" |
\{n,m} |
匹配前一项 n 到 m 次 | a\{2,4} 匹配 "aa", "aaa", "aaaa" |
\{n} |
匹配前一项恰好 n 次 | a\{3} 匹配 "aaa" |
\{n,} |
匹配前一项至少 n 次 | a\{2,} 匹配 "aa", "aaa"... |
\{-n,m} |
非贪婪匹配 n 到 m 次 | 尽可能少地匹配 |
注意:在默认的
magic模式下,+、?、{、}被视为普通字符。如果你想让它们发挥正则作用,必须加反斜杠\。
如果你执行:set nomagic,则规则完全反转:+、?等变成特殊字符,而^、$、.等可能需要转义。强烈建议保持默认的magic设置。
4. 分组与引用 (Grouping & Backreferences)
| 关键字 | 含义 |
|---|---|
$ ... $ |
定义一个子模式(分组) |
\1 ... \9 |
引用前面第 n 个分组匹配到的内容(反向引用) |
\%( ... $ |
定义一个不捕获的分组(类似于 (?:...)) |
示例:
查找重复的单词:$\w\+$\s\+\1
$\w\+$:捕获一个单词。\s\+:中间有一个或多个空白。\1:再次出现刚才捕获的那个单词。
5. 逻辑操作 (Logic)
| 关键字 | 含义 |
|---|---|
| |
或(OR)操作 |
\& |
且(AND)操作(通常用于 lookahead 模拟) |
6. 特殊匹配模式 (Very Magic / Very Nomagic)
为了避免大量的反斜杠,Vim 提供了前缀来改变解析规则:
-
\v(Very Magic): 在此模式下,除了0-9,a-z,A-Z,_之外,所有 ASCII 字符都具有特殊含义。这使得 Vim 正则看起来更像 Perl/Python 正则。- 例子:
\v(ab)+等同于$ab$\+。 - 推荐:在编写复杂正则时,建议在开头加上
\v。
- 例子:
-
\V(Very Nomagic): 只有\后面的字符才有特殊含义,其他全是普通字符。适用于纯文本搜索。
常见替换命令示例
-
将行尾的空格删除:
:%s/\s\+$//g(解释:
\s\+匹配一个或多个空白,$锚定行尾) -
将 "color" 和 "colour" 统一为 "color":
:%s/colou\=r/color/g(解释:
\=表示 'u' 出现 0 次或 1 次) -
交换两个单词的位置 (使用分组):
假设文本是 "hello world",想变成 "world hello"::%s/$\w\+$\s\+$\w\+$/\2 \1/g -
使用 Very Magic 简化写法:
:%s/\v(colou?r)/color/g(解释:
?在\v模式下直接表示 0 或 1 次,无需\?)
总结提示
- 默认模式 (
magic):^ $ . *是特殊的;+ ? { } ( ) |需要加\才是特殊的。 - 推荐习惯:在搜索或替换命令中,如果正则比较复杂,直接使用
\v开头(例如/\vpattern),这样可以减少转义字符的使用,使表达式更易读。 - 帮助文档:在 Vim 中输入
:help pattern可以查看最权威和详细的说明。

浙公网安备 33010602011771号