前言
在做文本编辑的时候,经常需要使用一些查找与替换的操作。
虽说在日常使用的文本编辑器中,比如IDEA
、VS Code
、Typora
等等,提供了基本的查找与替换的功能。但也仅仅只提供了简单的查找与替换,无法提供复杂的查找与替换功能。
在这里,我想通过展示几个相对复杂的查找与替换示例,来演示如何使用 Vim
中提供的对正则表达式(简称regex
)能力的支持。
语法说明
Vim 中的查找与替换功能的语法如下:
:range s/pattern/string/cgiI
对于范围(range
)中的每一行,将模式(pattern
)的匹配项替换(s
表示substitute)为字符串(string
)。
range
表示替换的范围,可以为:number
:行号,如果是范围为多行,使用英文逗号隔开.
:当前行$
:文件的最后一行%
:整个文件,相当于1,$
s
表示替换的简写pattern
表示查找的模式,可以使用正则表达式string
表示替换的字符串cgiI
表示控制替换操作的标志,比如c
表示是否手动确认每一次替换,g
表示整行
示例
注意⚠️
在以下示例的正则表达式写法中,分隔符没有使用常规的
/
,而是使用了:
作为分隔。这样做的好处是可以避免有时需要对
/
进行频繁的转义操作,比如:将/dir1/dir2/dir3/file
替换成/dir4/dir5/file2
时
- 如果使用
/
作为分隔符,那么最终的正则表达式为:s/\/dir1\/dir2\/dir3\/file/dir4\/dir5\/file2/g
- 而如果使用
:
作为分隔符,那么最终的正则表达式为:s:/dir1/dir2/dir3/file:/dir4/dir5/file2:g
示例一
需求场景:
1.将
is_supplier_inventory_direct_delivery_warehouse_code
中的下划线_
去除
2.并将下划线_
后一个字母大写。
正则表达式:
'<,'>s:\(_\)\(.\):\U\2:g
对正则表达式的解释:
'<,'>
:表示光标选中的文本
\(_\)
:表示要查找的对象,下划线_
,使用括号括起表示第一个分组
\(.\)
:表示单个字符,使用括号括起表示第二个分组
\U
:表示将后续字符转换为大写,放在这里使用表示将第二个分组的字符转换成大写
\2
:表示第二个分组(group)
示例二
需求场景:
将驼峰变量名转换成带下划线的格式。比如将
supplierCodeTestReg
变成supplier_code_test_reg
正则表达式:
'<,'>s:\([A-Z]\):_\L\1:g
对正则表达式的解释:
'<,'>
:表示光标选中的文本
\([A-Z]\)
:表示匹配大写字符
_
:表示下划线
\L
:表示将后续字符转换成小写,放在这里使用表示将第一个分组的字符转换成小写
\1
:表示第一个分组(group)
总结
相信你从上面的两个简短的示例中也可以看出 vim
对正则表达式的支持是非常强大的。
掌握正则表达式更多技巧之后,会拥有更高的文本编辑效率,偷懒利器。