oeasy教您玩转vim - 52 - # 正则查找
查找细节
回忆上节课内容🤔
我们上次研究了文件读写
打开是
e
,edit:e oeasy.txt
:e .
读是
:r
,read:1,3r o2z.txt
范围读:4,9r !ls -lah
读shell命令运行结果写是
:w
,write:w o3z.txt
直接写:3,8w o3z.txt
范围写:w o3z.txt >>
追加写:w! o3z
强制写命令行可以进行批量替换么?🤔
我们先回忆一下搜索的细节
搜索文件
/正向
/oeasy
从上到下搜索oeasy
hls
让搜索结果高亮n保持正方向
N改变为反方向
搜索到结尾之后可以用
wrapscan
从头搜索
?正向
?oeasy
从下到上搜索oeasy
hls
让搜索结果高亮n保持反方向
N改变反方向,改从正方向
搜索到开头之后也可以用
wrapscan
从头搜索
使用寄存器
如果想在搜索或者命令行模式下使用寄存器中的内容
可以这样ctrl+r然后指定寄存器
:ctrl+r*
把剪贴板里面的内容粘贴到
:
后面:h c_ctrl-r
查询命令行模式下的ctrl+r

匹配模式
除了完全匹配的单词之外
搜索也支持模式匹配
{pattern}
什么模式匹配
:h pattern

动手练习
:r !ls -lah
/shiyanlou
修改大小写
然后尝试大小写的匹配
大写小写
如果查找要忽略大小写的话
就用
ignorecase
:set ignorecase
简写为
:se ic
取消为
:se noic
ignorecase
可以和smartcase
智慧大小写配合/oeasy
忽略大小写/Oeasy
必须完全符合如果搜索模式里面有
大写字母
就完全匹配如果没有
大写字母
就忽略大小写还可以加开关
/oeasy\c
不区分大小写的oeasy
/oeasy\C
区分大小写的oeasy
具体可以
:h ignorecase

模式是什么意思?
字符重复*
字符数量
*
代表0到任意多个前字符+
代表1到任意多个前字符?
代表0或1个前字符/a*
可以匹配a
aa
aaa
`` 空串也可以匹配
/\(oe\)*
可以匹配oe
oeoe
oeoeoe
`` 空串也可以匹配
()括号
中的oe是一个可重复的原子\(\)
括号符前面加反斜杠转义

字符重复+
+
对应1
到任意多个字符/oe\+
可以匹配oe
oee
oeee
不能匹配
o

/\(oe\)\+
可以匹配oe
oeoe
字符重复=
=
对应0或1
次重复

字符重复 \{3,5}
指定次数

*
对应\{0,}
+
对应\{1,}
=
对应\{0,1}
并列关系

/oeasy\|o2z
匹配oeasy
或者o2z
/oeasy\|o2z\|o3z
匹配oeasy
或者o2z
或者o3z
/\(ab\|cd\)\+
匹配abab
或者abcd
或者cdab
或者cdcd
或者ababab..
等
字符范围
/a\|b\|c\|d
可以用
/[abcd]
来描述也可以用
/[a-d]
来描述a-d
代表从a
到d
[a-z]
代表任意小写字母[A-Za-z]
代表任意字母[0-9a-gz]
代表数字或a-g或z

特殊字符
特殊字符也可以放到字符范围里

排除字符^
\[^a]
^
在中括号内部开头时代表排除
a
以外的所有字符在中括号内部开头时
^
的意思是排除不在中括号内部开头时
表示行头
/^dr
匹配行头是dr
的

预设字符范围
有一些字符范围是很常用的
vim做些预设
比如
.
代表任意字符

能用字符预设就不用字符范围
\d 数字
\D 非数字
\x 十六进制数
\X 非十六进制数
\s 空格和tab
\S 非空格和tab
\l 小写字母
\L 非小写字母
\u 大写字母
\U 非大写字母
字符预设匹配的速度很快
用了字符预设就不用[]了
/[\d\l]* 是不能用的
可以用 /(\d\l)* 代替
练习

上述三个表达式是相同的
尽量选第二种表示方法
绝对要避免第三种表示方法
因为那太慢
匹配换行
/one\ntwo
可以匹配换行s\nd
可以匹配上一行以s结尾,本行以d开头/one\_stwo
可以匹配换行也可以匹配空格one two
\s
是空格\_s
是空格或者换行前面加上
\_
就是给字符或上换行符\_.
匹配包括换行符的任意字符/"\_[^"]*"
被引号包裹起来的
任意多个除了引号外的包括换行符的所有字符
[^"]
除了引号外的所有字符不包括换行符\_[^"]
除了引号外的所有字符也包括换行符\_[^"]*
任意多个除了引号外的所有字符也包括换行符/"\_[^"]*"
这样就可以匹配带换行的字符串了
动手试一试

贪婪匹配
默认
*
的匹配是贪婪的找行内最大范围内的匹配
注意这把连个
markdown
的加粗标记连在一起了

\*\*.*\*\*
\*\*
代表前两个星号.
的数量是*
\*\*
代表后两个星号
非贪婪匹配
还有一种非贪婪匹配
他是非贪婪的
只找最小范围内的匹配
注意他把这两个分开了
\*\*.\{-}\*\*
\*\*
代表前两个星号.的数量是
\{-}
\*\*
代表后两个星号.
的数量是\{-}

正则表达
行头行尾
^
意味着行开头$
意味着行结尾词头词尾
\<
意味着单词开头\>
意味着单词结尾/^a[a-z]*d$
a开头
d结尾
中间有任意多个小写字母
c语言标识符

\h
意味着[A-Za-z_]
大小写字母和下划线
\w
意味着[0-9A-Za-z_]
大小写字母和下划线和数字
/\<\h\w*\>
以字母或下划线开头
后跟字母下划线或数字
这是c语言标识符的语法规则
不以什么为开头
/\(o\)\@<!easy
aeasy
中的easy
可以匹配beasy
中的easy
也可以匹配easy
还可以匹配就是不匹配
oeasy
中的easy
但是匹配
oeasy
中的easy
加上词头词尾
/.<\(o\)\@<!easy\>
aeasy
、beasy
都可以匹配easy
也可以匹配就是不匹配
oeasy
不以什么为结尾

oea\(sy\)\@!
oeasx
中的oea
可以匹配oeasz
中的oea
也可以匹配oea
也都可以匹配就连
oeas
中的oea
也都可以匹配就是不匹配
oeasy
中的oea
加上词头词尾
/oea\(sy\)\@!..\>
oeasx
匹配oeasz
匹配oeasy
不匹配
总结
我们温习了关于搜索的相关内容
是否忽略大写小写
是否从头开始查找
是否高亮显示
/正向,?反向
n保持方向,N改变方向
可以设置
还有一些正则表达式的使用方法
行头行尾
^$
词头词尾
\<\>
字符列表
[a-z]
、[A-Za-z_]
包含回车
one\_stwo
数量
数量
*
、?
、=
具体数量
\{1,3}
非贪婪
\{-}
不以什么为开头结尾
不以什么为开头
\@<!
不以什么为结尾
\@!
查找出来怎么替换呢?🤔
下次再说 *
[Github地址] (https://github.com/overmind1980/oeasyvim)
[Gitee地址] (https://gitee.com/overmind1980/oeasyvim)
[蓝桥实验楼 邀请码FJWYIMGB] (https://www.lanqiao.cn/courses/2840)