Vim 正则表达式
Vim 中正则表达式的使用指南
📋 概述
Vim 使用自己的正则表达式引擎(magic 模式),与标准正则表达式略有不同。
🎯 基本元字符
字符匹配
| 元字符 | 说明 | 示例 |
|---|---|---|
. | 匹配任意字符(除换行符) | a.c 匹配 “abc”、“a1c” |
\ | 转义字符 | \. 匹配字面量 ”.” |
[] | 字符类 | [abc] 匹配 a、b 或 c |
[^] | 否定字符类 | [^abc] 不匹配 a、b、c |
- | 字符范围 | [a-z] 匹配小写字母 |
\d | 数字 | \d 匹配 0-9 |
\D | 非数字 | \D 匹配非数字字符 |
\w | 单词字符 | \w 匹配字母、数字、下划线 |
\W | 非单词字符 | \W 匹配非单词字符 |
\s | 空白字符 | \s 匹配空格、Tab 等 |
\S | 非空白字符 | \S 匹配非空白字符 |
数量限定符
| 元字符 | 说明 | 示例 |
|---|---|---|
* | 匹配前一个字符 0 次或多次 | a* 匹配 ""、“a”、“aa” |
\+ | 匹配前一个字符 1 次或多次 | a\+ 匹配 “a”、“aa” |
\? | 匹配前一个字符 0 次或 1 次 | a\? 匹配 ""、“a” |
\{n\} | 匹配前一个字符 n 次 | a\{3\} 匹配 “aaa” |
\{n,\} | 匹配前一个字符至少 n 次 | a\{2,\} 匹配 “aa”、“aaa” |
\{n,m\} | 匹配前一个字符 n 到 m 次 | a\{2,4\} 匹配 “aa”、“aaa”、“aaaa” |
位置锚点
| 元字符 | 说明 | 示例 |
|---|---|---|
^ | 行首 | ^hello 匹配行首的 “hello” |
$ | 行尾 | world$ 匹配行尾的 “world” |
\< | 单词开头 | \<word 匹配单词开头的 “word” |
\> | 单词结尾 | word\> 匹配单词结尾的 “word” |
\b | 单词边界 | \bword\b 匹配独立的 “word” |
🔍 搜索中的正则
基本搜索
" 搜索包含数字的行
/\d\+
" 搜索以 hello 开头的行
/^hello
" 搜索以 world 结尾的行
/world$
" 搜索完整的单词
/\<word\>字符类示例
" 搜索小写字母
/[a-z]
" 搜索数字
/[0-9]
" 搜索字母或数字
/[a-zA-Z0-9]
" 搜索非数字
/[^0-9]数量限定符示例
" 搜索一个或多个数字
/\d\+
" 搜索 3 个连续的数字
/\d\{3\}
" 搜索 2-4 个连续的数字
/\d\{2,4\}🔄 替换中的正则
基本替换
" 替换所有数字为 X
:%s/\d/X/g
" 替换行首的空格
:%s/^\s\+//g
" 替换行尾的空格
:%s/\s\+$//g分组(Grouping)
使用 \( 和 \) 进行分组,用 \1、\2 等引用:
" 交换两个单词
:%s/\(word1\) \(word2\)/\2 \1/g
" 示例:将 "foo bar" 替换为 "bar foo"
:%s/\(foo\) \(bar\)/\2 \1/g替换示例
" 在每行开头添加注释
:%s/^/# /g
" 删除行尾空格
:%s/\s\+$//g
" 将多个空格替换为单个空格
:%s/\s\+/ /g
" 交换日期格式(MM/DD/YYYY → YYYY-MM-DD)
:%s/\(\d\{2\}\)\/\(\d\{2\}\)\/\(\d\{4\}\)/\3-\1-\2/g🎨 高级技巧
非贪婪匹配
Vim 默认是贪婪匹配,使用 \{-} 实现非贪婪:
" 贪婪匹配(默认)
/.*bar " 匹配到最后一个 "bar"
" 非贪婪匹配
/.\{-}bar " 匹配到第一个 "bar"或操作符
使用 \| 表示或:
" 匹配 "foo" 或 "bar"
/foo\|bar
" 在替换中使用
:%s/foo\|bar/XXX/g前瞻和后顾
" 正向前瞻(匹配后面跟着 pattern 的内容)
/pattern\@=
" 负向前瞻(匹配后面不跟着 pattern 的内容)
/pattern\@!
" 正向后顾(匹配前面跟着 pattern 的内容)
/pattern\@<=
" 负向后顾(匹配前面不跟着 pattern 的内容)
/pattern\@<!📝 实用示例
1. 删除空行
" 删除完全空白的行
:%s/^\s*$//g
" 或使用
:g/^\s*$/d2. 删除行尾空格
:%s/\s\+$//g3. 在每行开头添加内容
" 添加注释符号
:%s/^/# /g
" 添加行号(需要配合函数)4. 格式化代码
" 删除多余的空行(保留一个)
:%s/\n\{3,}/\r\r/g
" 在操作符前后添加空格
:%s/\([+\-*/=]\)/\1 /g5. 提取内容
" 提取引号内容(复制到替换部分)
:%s/.*"\(.*\)".*/\1/g6. 批量重命名
" 将驼峰命名改为下划线命名
:%s/\C\([a-z]\)\([A-Z]\)/\1_\l\2/g🔧 Magic 模式
Vim 有不同的 magic 模式:
默认模式(magic)
大多数元字符需要转义:
/\(pattern\) " 分组需要转义非常 magic 模式(\v)
使用 \v 前缀,大多数元字符不需要转义:
/\v(pattern) " 分组不需要转义
/\v\d+ " + 不需要转义非 magic 模式(\V)
使用 \V 前缀,只有反斜杠有特殊含义:
/\Vpattern " 只有 \ 需要转义示例对比
" magic 模式(默认)
/\(foo\|bar\) " 需要转义
" 非常 magic 模式
/\v(foo|bar) " 不需要转义
" 非 magic 模式
/\Vfoo\|bar " | 是字面量💡 常用模式
匹配邮箱
/\v[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}匹配 URL
/\vhttps?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/[^\s]*)?匹配 IP 地址
/\v\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}匹配 HTML 标签
" 匹配标签
/\v<[^>]+>
" 匹配标签内容
/\v<(\w+)>.*</\1>⚠️ 注意事项
1. 转义字符
在 Vim 中,许多字符需要转义:
" 需要转义的字符
\( \) \{ \} \| \+ \? \* \. \^ \$2. 换行符
在搜索中,换行符是 \n;在替换中,换行符是 \r:
" 搜索换行符
/\n
" 替换为换行符
:%s/pattern/\r/g3. 特殊字符
" Tab 字符
/\t
" 回车符
/\r
" 换行符
/\n4. 大小写
" 忽略大小写(临时)
/\cpattern
" 区分大小写(临时)
/\Cpattern🎯 实战练习
练习 1:清理代码
" 删除行尾空格
:%s/\s\+$//g
" 删除多余空行
:%s/\n\{3,}/\r\r/g
" 统一缩进(假设使用空格)
:%s/^\t\+/ /g练习 2:格式化数据
" CSV 格式转换
" 将 "a,b,c" 转换为 "a | b | c"
:%s/,/ | /g练习 3:提取信息
" 从日志中提取 IP 地址
" 假设格式:192.168.1.1 - - [date] "GET /path"
:%s/.*\(\(\d\{1,3\}\.\)\{3\}\d\{1,3\}\).*/\1/g📚 参考资源
:help pattern- Vim 正则表达式帮助:help magic- Magic 模式说明:help /\v- 非常 magic 模式
相关文档: