VIM Search and Pattern Regex Summary

既然已经选择了VIM,那么当然要在文本处理效率上走向极致, 本篇主要记录一下vim中常用的正则表达式操作, 来进一步提高自己的效率。

Quick Index

1
2
3
4
删除行尾空格: %s/\s\+$//
删除行首空格: %s/^\s*//
删除空行: g/^\s*$/d # g: line matching pattern, d: delete
交换前后两个单词顺序: %s/\(\w\+\)\(\W\+\)\(\w\+\)/\3\2\1/gc

基本操作

1
2
:[line num1, line num2]s/str1/str2/flag # 匹配num1-num2的行
:%s/str1/str2/flag # 全文匹配

也可以先用visual (v) 来选择一段文本再使用:s进行替换。

Flags

1
2
3
4
5
g: Global - Apply to each occurence
c: Confirm - Ask for each replacement
e: Error - Don not display error
I: Case sensitive
i: Ignore - Case insensitive

Metacharacters (元字符)

vim定义了一些元字符,具有特殊的作用:

  • ., *, \, [, ^, $ 是元字符,具有特殊意义
  • Collection: [1a-c] : (1, a, b, c), 反选用^ ([^a-c])
  • Complete matching: <str> 不会匹配 string
  • +, ?, |, &, {, (, )需要escaped的方式来使用它们的特殊功能(\+)
  • Backreference: \(str\), 之后可以使用\#进行选择
Meta Description
. 任意一个字符
[abc] 集合中的任意一个字符
\d 阿拉伯数字 [0-9], 大写反选
\x 十六进制 [0-9A-Fa-f], 大写反选
\l [a-z]大写反选
\u [A-Z]大写反选
\w 单词字符[0-9A-Za-z]大写反选
\t tab
\s 匹配空白字符[ \t],大写反选
^ 匹配行首
$ 匹配行尾
\r 新一行
\n null
\< 词首
\> 词尾
\zs patter 的开始
\ze patter 的结束
`\ ` 或者
\& 分开匹配,匹配项的先后顺序无关

关于zs和ze非常好用: :s/Copyright \zs2007\ze All Rights Reserved/2008/g 就会只替换2007, 能避免我们敲一堆东西

Repetition: 重复

vim可以重复某一匹配patter, 也同样有一些具有重复作用的元字符: 匹配foo以及任意两个字符:

1
\{#\}: (/foo.\{2\})

  • 用于重复的元字符:
Meta Description
* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0或1个
\{n, m} 匹配n-m个
\{n} 匹配n个
\{n,} n-任意个
\{,m} 0-m个

Backreference

  • \( \)可以建立一个backreference, 之后使用\# (#为数字)进行引用:
1
2
3
4
5
6
7
Original Text:
Hello, Alice

:s/\(hello\)\(s*\)\([\u\l]+\)/\3\2, welcome!/g

After substitution:
Alice, Welcome!

Using Current Register or Word

我们有的时候可能首先全文搜索某些东西,然后想直接对其进行替换的话,在搜索完直接替换即可,不需要再次输入search的pattern

1
:%s//new str/g

或者我们首先剪切or复制了一些东西,这些内容会被存到寄存器里,(可以通过:reg)查看这些寄存器里面存的都是啥, 用下面的命令让字符替换为我们寄存器里的值

1
:s/ffo/<c-r>0/g

<c-r>指的是按Ctrl+R,之后指定寄存器的名字即可

Reference:

  1. Vim Tips Wiki
  2. Vim Documentation

Changelog

2019-03-08: Fix typo in title (Thanks to Yeezhou Tang)