目录
- 正则表达式
- 1.特殊字符
- 2.字符类(character-classes)
- 3.规则
- 4.交替和分组
- 5.量词(quantifier)和重数(multi)
- 贪婪模式(greedy)
- 非贪婪模式(non-greedy)
- 6.魔法(magic)详解
- 6.1.基本魔法(magic)
- 6.2.无魔法(no magic)
- 6.3.深度魔法(very magic)
- 7.正则表达式举例
- 7.1.精确匹配单词
- 7.2.变量,方法或类的重命名
- 7.3.函数参数的重排列
- 用参数列表处理多个文件
- 命令
- 举例
- update
- 行内搜索
- 替换字符串
- 搜索命令
- 1.grep
- 2.vimgrep
- 3.ack
- 替换命令
- 命令形式
- 举例
- 转义
正则表达式
1.特殊字符
符号 | 说明 | 注释 |
---|---|---|
. | 任意字符,但不包括行尾 | |
^ | 行首 | |
$ | 行尾 | |
\_ | 任意字符,包括行尾 | |
\< | 单词开始 | |
\> | 单词结尾 |
#完整列表
:help ordinary-atom
2.字符类(character-classes)
符号 | 说明 | 注释 |
---|---|---|
\s | 一个空白字符(包括Tab和Space) | |
\d | 一个数字 | |
\w | 一个单词 | |
\l | 一个小写字符 | |
\u | 一个大写字符 | |
\a | 一个字母 |
- 大写反类
:help character-classes
3.规则
- [] - 字符集合,例如
[A-Z0-9]
,[,4abc]
[^]
- 补集,例如[^0-9A-Za-z]
4.交替和分组
符号 | 说明 | 注释 |
---|---|---|
| | 交替(alternation) | 或 |
\(\) | 分组(grouping) | 将多个字符放在一组 |
#同时匹配carrot和parrot
carrot\|parrot
#分组和其他正则表达式组合使用
\(c\|p\)arrot#分组匹配到的字符串还可以在后面的替换中重用
#'cat hunting mice'替换成'mice hunting cat'
:s/\(cat\) hunting \(mice\)/\2 hunting \1/
5.量词(quantifier)和重数(multi)
字符或字符区间后面接量词,也称为重数.
符号 | 说明 | 注释 |
---|---|---|
* | 0或多个 | 贪婪匹配模式 |
\+ | 1或多个 | 贪婪匹配模式 |
\{-} | 0或多个 | 非贪婪匹配模式 |
\?或\= | 0或1个 | 贪婪匹配模式 |
\{n,m} | n~m个 | 贪婪匹配模式 |
\{-n,m} | n~m个 | 非贪婪匹配模式 |
#量词的完整列表
:help multi
贪婪模式(greedy)
尽可能多地匹配字符
非贪婪模式(non-greedy)
尽可能少地匹配字符
#匹配一个或多个单词
\w\+#匹配2-4个连续的字符a
a\{2,4}#对于字符串'foo2bar2'#匹配'foo2bar2'
\w\+2#匹配'foo2
\w\{-1,}2
6.魔法(magic)详解
6.1.基本魔法(magic)
- 默认模式
.和*
之外,大部分特殊字符都需要转义- 显式设置:在正则表达式字符串前加上
\m
,例如/\mfoo
或者:s/\mfoo/bar
.
6.2.无魔法(no magic)
- 所有特殊字符都需要转义,例如:在基本魔法时
/^.*$
,无魔法时为/\^\.\*\$
- 显式设置:在正则表达式字符串前加上
\M
.vimrc
中设置:set nomagic
,最好不要这样设置
6.3.深度魔法(very magic)
- 将数字,字母,下划线之外的字符都视为特殊字符
- 显式设置:在正则表达式前加上
\v
- 使用场合:特殊字符比较多
#将'cat hunting mice'替换成'mice hunting cat'#基本魔法
:%s/\(cat\) hunting \(mice\)/\2 hunting \1/g
#深度魔法
:%s/\v(cat) hunting (mice)/\2 hunting \1/g
7.正则表达式举例
7.1.精确匹配单词
#精确匹配单词
#搜索animal
# / - 正向搜索
# \< - 单词开始
# animal - 搜索的单词
# \> - 单词结尾
/\<animal\>
7.2.变量,方法或类的重命名
#1.
:arg **/*.py#2.把光标移动到需要重命名的类上#3.
#[ctrl+r,ctrl+w]是快捷键,将光标下的单词插入当前命令中
:argdo %s/\<[ctrl+r,ctrl+w]\>/Pitbull/gec | update
#或者
:argdo %s/\<Dog\>/Pitbull/gec | update#4.
#y同意,n拒绝:args#先查看文件
:vimgrep /\<Dog\>/ **/*.py
:cn
:cp
:copen
7.3.函数参数的重排列
:arg **/*.py
#"\v<act>\(" 完整匹配 "act("
#'(\w{-1,}), ([^,]{-1,})\)' 匹配 'group1, group2)'
:argdo %s/\v<act>\((\w{-1,}), ([^,]{-1,})\)/act(\2, \1)/gec |update
用参数列表处理多个文件
(argument list, arglist)
支持多个文件执行同一操作.
每个参数列表项都在缓冲区列表中,但不是每个缓冲区都在参数列表中.
命令
命令 | 说明 | 注释 |
---|---|---|
:arg | 定义参数列表 | |
:argdo | 对参数列表中的所有文件执行一条命令 | |
:args | 显示参数列表中的文件列表 |
举例
:arg **/*.py
#update 等价于 :write,用于保存被修改过的缓冲区
:argdo %s/\<animal\>/creature/ge | update
:args
update
vim切换缓冲区时推荐保存当前缓冲区.
另一种方案
#隐藏警告
:set hidden
#保存所有
:wa
行内搜索
命令 | 说明 | 注释 |
---|---|---|
t | 后面接一个字符,用于当前行内搜索,光标在字符之前 | until |
T | T反向 | |
f | 后面接一个字符,用于当前行内搜索,光标在字符之上 | find |
F | F反向 | |
; | 重复下一个 | |
, | 重复上一个 |
替换字符串
vim中替换字符串的方法有哪些
:%s/str1/str2/g
搜索命令
命令 | 说明 | 注释 |
---|---|---|
/关键字 | 正向搜索 | |
?关键字 | 反向搜索 | |
n | 下一个 | next |
N | 上一个 | |
* | 搜索光标下的单词 | |
:nohlsearch | 关闭搜索高亮 | 单次 |
:grep | 跨文件搜索 | |
:vimgrep | 跨文件搜索 | |
:ack | 跨文件搜索 |
1.grep
2.vimgrep
:vimgrep <模式> <路径>#参考2.5.2 用/和?搜索
#当<路径>为"**"时,表示对目录进行递归
:vimgrep animal **/*.py#在不打开 quickfix,快速浏览quickfix
#下一个
:cn
:cnext
#上一个
:cp
:cprevious
:cN#打开quickfix列表
:copen
jk #上下移动
enter #打开
#退出quickfix
:q
ctrl+w,q
3.ack
sudo apt install ack-grep
Beyond grep: https://beyondgrep.com/
#递归搜索所有包含Animal的python文件
ack --python Animal#安装插件ack.vim后,在vim中执行,搜索结果显示在quickfix中
:Ack --python Animal
#注意第一个字母需要大写
替换命令
命令形式
#搜索和替代
:substitute
:<作用范围>s/<find-this>/<replace-with-this>/<flags>#flags:可以结合起来使用(除了i和I之外)
# g - 全局替换
# c - 每次替换前需要确认
# e - 没有匹配项时不显示错误
# i - 忽略大小写
# I - 区分大小写#作用范围
# % - 整个文件,替换完后,在状态栏显示多少个被替换
# 数字 - 表示行号
# $ - 最后一行
# /search-pattern/ - 搜索结果所在的行
# ?backwards-search-pattern? - 反向搜索结果行
# ; - 区间范围组合起来,例如17;$表示从17行到最后一行
举例
#使用cat代替首个dog
#没有指定范围
:s/cat/dog#整个文件全部匹配项代替,忽略大小写
:%s/cat/dog/gi#整个文件全部匹配项代替
:%s/java/python/g#作用范围:12行开始 - 搜索到dog为止
#此范围内匹配项全部替换
:12;/dog/s/animal/creature/g#可视模式下,选择区域作为作用范围
#此范围内匹配项全部替换
:s/cat/dog/g
转义
- 转义 - 避免与替换命令的分隔符混淆
- 修改替换命令的分隔符 - 避免混淆
#两种方式等价
#1.替换命令分隔符被修改为+
:s+path/to/dir+path/to/other/dir+gc
#2.使用\/转义
:s/path\/to\/dir/path\/to\/other\/dir/gc