最基本的 6 个特殊模式项:
- \? 表示之前的匹配原重复零次或一次:如 aa\? 可以匹配“a”、“aa”,但不能完整匹配“aaa”(可以匹配其前两个字符、后两个或最后一个字符)。
- \+ 表示之前的匹配原重复一次或多次:如 aa\+ 可以匹配“aa”、“aaa”,但不能匹配“a”或“b”。
- \{n,m} 表示之前的匹配原重复 n 到 m 遍之间,两个数字可以省略部分或全部:如 a\{3}(可读作:3 个“a”)可以匹配“aaa” ,a\{,3}(可读作:最多 3 个“a”)可以匹配“”、“a”、“aa”和“aaa”;两个数字都省略时等价于 *,也就是之前的匹配原可以重复零次或多次。
- \( 和 \) 括起一个模式,将其组成为单个匹配原:如 \(foo\)\? 可以表示单词“foo”出现零次或一次。\( 和 \) 还有一个附加作用,是捕获匹配的内容,按 \( 出现的先后顺序,可以用 \1、\2 到 \9 来引用。如果你不需要捕获匹配内容的话,用 \%( 和 \) 的性能更高。
- \& 是分支内多个邻接(concat)的分隔符,概念上可以和与操作相比,表示每一项都需要匹配成功,然后取最后一项的结果返回:如 .*foo.*\&.*bar.* 匹配同时出现了“foo”和“bar”的完整行。相对来讲,\& 没那么常用。
- \| 是多个分支的分隔符,概念上可以和或操作相比,表示任意一项匹配成功即可:如 foo\|bar 可匹配“foo”或“bar”两单词之一。
接下来,是 13 个特殊模式项。虽然它们相对来说不那么必需,但掌握它们可以大大地提高程序员的编辑效率。
- \< 匹配单词的开头
- \> 匹配单词的结尾
- \s 匹配空白字符 <Space> 和 <Tab>
- \S 匹配非空白字符\d 匹配数字,相当于 [0-9]
- \D 匹配非数字,相当于 [^0-9]
- \x 匹配十六进制数字,相当于 [0-9A-Fa-f]
- \X 匹配非十六进制数字,相当于 [^0-9A-Fa-f]
- \w 匹配单词字符,相当于 [0-9A-Za-z_]
- \W 匹配非单词字符,相当于 [^0-9A-Za-z_]
- \h 匹配单词首字符,相当于 [A-Za-z_]
- \H 匹配非单词首字符,相当于 [^A-Za-z_]
- \c 忽略大小写进行匹配
以上我们讨论的实际上是 Vim 缺省设置下的正则表达式。