vim正则表达式

本文只打算将非常常用而易忘记的内容记录下来,而不打算将 Vim 正则表达式中晦涩的部分展示出来,而且通常我们不会用到。Vim 的正则表达式主要用于文本替换(s 命令)。

Vim 正则表达式转义字符

这种转义字符又称为 metacharacters ,以下是典型的 Vim 转义字符。

# Matching # Matching
. 除了换行符的任意字符
\s 空白符 \S 非空白字符
\d 数字 \D 非数字
\x 十六进制字符 \X 非十六进制字符
\o 八进制字符 \O 非八进制字符
\h 字母和下划线(单词头字符) \H 非字母和下划线
\p 可打印字符 \P 除去数字的可打印字符
\w 单词字符 \W 非单词字符
\a 字母字符(alphabetic) \A 非字符字符
\l 小写字符 \L 非小写字符
\u 大写字符 \U 非大写字符

Quantifiers, Greedy and Non-Greedy

Quantifiers 描述
* 匹配0个或多个字符
\+ 匹配1个或多个字符
\= 匹配0个或1个字符
\{n,m} 匹配n~m个字符
\{n} 匹配n个字符
\{,m} 匹配至多m个字符
\{n,} 匹配至少n个字符

以上限定词是贪婪的,以下表格的是非贪婪的。

Quantifiers 描述
\{-} 匹配0个或多个字符
\{-n,m} 非贪婪匹配n~m个字符
\{-n,} 匹配至少n个字符
\{-,m} 匹配至多m个字符

还有一些必须转义的字符 \* \. \/ \\ \[ 表示它们本身。\| 表示正则表达式的 or 操作。$ 行尾 ^ 行首 \< 词首 \> 词尾也是非常重要的。

以下正则是可选的一个例子:

\(Date:\|Subject:\|From:\)\(\s.*\)

Grouping and Backreferences

Vim 的正则表达式一样有捕获组的概念,用 \( \) 就能产生一个捕获组。在替换部分可以用 \1 \2 等来引用这些捕获组。

# 描述
& 引用整个匹配
\0 引用整个匹配
\1 引用第一个捕获组
\2 引用第二个捕获组
\9 引用第九个捕获组,依次类推
~ 引用前一个替换字符串
\L 接下来的字符都是小写的
\U 接下来的字符都是大写的
\E 结束 \U \L
\e 结束 \U \L
\r 添加一个换行符
\l 下一个字符标记为小写
\u 下一个字符标记为大写

Global 命令

Vim 的正则表达式除了可以运用于替换(substitute)之外,还可以运用于 global 命令。通用形式如下:

:range g[lobal][!]/pattern/cmd

以上表示将 range (默认是整个文件)内的行匹配模式 pattern 的那些行执行命令 cmd。! 的含义是不匹配的行将执行命令。如:

:g/^\s*$/ d

将删除所有空行。