前言

在做文本编辑的时候,经常需要使用一些查找与替换的操作。

虽说在日常使用的文本编辑器中,比如IDEAVS CodeTypora等等,提供了基本的查找与替换的功能。但也仅仅只提供了简单的查找与替换,无法提供复杂的查找与替换功能。

在这里,我想通过展示几个相对复杂的查找与替换示例,来演示如何使用 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 对正则表达式的支持是非常强大的。

掌握正则表达式更多技巧之后,会拥有更高的文本编辑效率,偷懒利器。

引用