前言
在做文本编辑的时候,经常需要使用一些查找与替换的操作。
虽说在日常使用的文本编辑器中,比如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 对正则表达式的支持是非常强大的。
掌握正则表达式更多技巧之后,会拥有更高的文本编辑效率,偷懒利器。