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*$/d

2. 删除行尾空格

:%s/\s\+$//g

3. 在每行开头添加内容

" 添加注释符号
:%s/^/# /g
 
" 添加行号(需要配合函数)

4. 格式化代码

" 删除多余的空行(保留一个)
:%s/\n\{3,}/\r\r/g
 
" 在操作符前后添加空格
:%s/\([+\-*/=]\)/\1 /g

5. 提取内容

" 提取引号内容(复制到替换部分)
:%s/.*"\(.*\)".*/\1/g

6. 批量重命名

" 将驼峰命名改为下划线命名
:%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/g

3. 特殊字符

" Tab 字符
/\t
 
" 回车符
/\r
 
" 换行符
/\n

4. 大小写

" 忽略大小写(临时)
/\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 模式

相关文档