oeasy教您玩转vim - 52 - # 正则查找
Vim 查找 玩转 正则 52 oeasy
2023-09-27 14:22:10 时间
查找细节
回忆上节课内容🤔
- 我们上次研究了文件读写
-
打开是
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地址] (overmind1980/oeasyvim)
[蓝桥实验楼 邀请码FJWYIMGB] (oeasy 教您零基础玩转编辑神器 Vim_Linux - 蓝桥云课)