vim正则关键字

在 Vim 中,正则表达式(Regular Expressions)非常强大,但其语法与常见的 Perl 或 Python 正则略有不同。Vim 的正则关键字(元字符)根据是否开启“魔术”模式(magic mode)而有所变化。

默认情况下,Vim 使用 magic 模式(即 :set magic,这是默认设置)。在此模式下,部分字符具有特殊含义,而其他字符需要加 \ 转义才具有特殊含义。

以下是 Vim 正则表达式中常用的关键字和元字符分类总结:

1. 锚点 (Anchors)

用于匹配位置而非字符。

关键字 含义 示例
^ 匹配行首 ^start 匹配以 "start" 开头的行
$ 匹配行尾 end$ 匹配以 "end" 结尾的行
\< 匹配单词开头 \<foo 匹配 "foobar" 中的 "foo",不匹配 "barfoo"
\> 匹配单词结尾 foo\> 匹配 "barfoo" 中的 "foo",不匹配 "foobar"
\%5l 匹配第 5 行 特定行号匹配
\%5c 匹配第 5 列 特定列号匹配

2. 字符类 (Character Classes)

关键字 含义 等价范围
. 匹配任意单个字符(除换行符外)
\d 匹配数字 [0-9]
\D 匹配非数字 [^0-9]
\s 匹配空白字符(空格、Tab等) [ \t]
\S 匹配非空白字符 [^ \t]
\w 匹配单词字符(字母、数字、下划线) [a-zA-Z0-9_]
\W 匹配非单词字符 [^a-zA-Z0-9_]
\x 匹配十六进制数字 [0-9a-fA-F]
\o 匹配八进制数字 [0-7]
\a 匹配字母 [a-zA-Z]
\l 匹配小写字母 [a-z]
\u 匹配大写字母 [A-Z]

自定义字符组:

  • [abc]:匹配 a、b 或 c 中的任意一个。
  • [^abc]:匹配除了 a、b、c 之外的任意字符。
  • [a-z]:匹配范围内的字符。
  • [:alnum:]:POSIX 字符类,需在括号内使用,如 [[:alnum:]]

3. 数量限定符 (Quantifiers)

magic 模式下,这些符号通常需要加 \ 才能表示数量含义(这与很多其他正则引擎相反,其他引擎通常默认 + ? 有特殊含义,而 Vim 默认它们是普通字符)。

关键字 含义 示例
* 匹配前一项 0 次或多次 ab*c 匹配 "ac", "abc", "abbc"
\+ 匹配前一项 1 次或多次 ab\+c 匹配 "abc", "abbc" (不匹配 "ac")
\= 匹配前一项 0 次或 1 次 ab\=c 匹配 "ac", "abc"
\{n,m} 匹配前一项 n 到 m 次 a\{2,4} 匹配 "aa", "aaa", "aaaa"
\{n} 匹配前一项恰好 n 次 a\{3} 匹配 "aaa"
\{n,} 匹配前一项至少 n 次 a\{2,} 匹配 "aa", "aaa"...
\{-n,m} 非贪婪匹配 n 到 m 次 尽可能少地匹配

注意:在默认的 magic 模式下,+?{} 被视为普通字符。如果你想让它们发挥正则作用,必须加反斜杠 \
如果你执行 :set nomagic,则规则完全反转:+? 等变成特殊字符,而 ^$. 等可能需要转义。强烈建议保持默认的 magic 设置

4. 分组与引用 (Grouping & Backreferences)

关键字 含义
$ ... $ 定义一个子模式(分组)
\1 ... \9 引用前面第 n 个分组匹配到的内容(反向引用)
\%( ... $ 定义一个不捕获的分组(类似于 (?:...)

示例:
查找重复的单词:$\w\+$\s\+\1

  • $\w\+$:捕获一个单词。
  • \s\+:中间有一个或多个空白。
  • \1:再次出现刚才捕获的那个单词。

5. 逻辑操作 (Logic)

关键字 含义
| 或(OR)操作
\& 且(AND)操作(通常用于 lookahead 模拟)

6. 特殊匹配模式 (Very Magic / Very Nomagic)

为了避免大量的反斜杠,Vim 提供了前缀来改变解析规则:

  • \v (Very Magic): 在此模式下,除了 0-9, a-z, A-Z, _ 之外,所有 ASCII 字符都具有特殊含义。这使得 Vim 正则看起来更像 Perl/Python 正则。

    • 例子:\v(ab)+ 等同于 $ab$\+
    • 推荐:在编写复杂正则时,建议在开头加上 \v
  • \V (Very Nomagic): 只有 \ 后面的字符才有特殊含义,其他全是普通字符。适用于纯文本搜索。

常见替换命令示例

  1. 将行尾的空格删除:

    :%s/\s\+$//g
    

    (解释:\s\+ 匹配一个或多个空白,$ 锚定行尾)

  2. 将 "color" 和 "colour" 统一为 "color":

    :%s/colou\=r/color/g
    

    (解释:\= 表示 'u' 出现 0 次或 1 次)

  3. 交换两个单词的位置 (使用分组):
    假设文本是 "hello world",想变成 "world hello":

    :%s/$\w\+$\s\+$\w\+$/\2 \1/g
    
  4. 使用 Very Magic 简化写法:

    :%s/\v(colou?r)/color/g
    

    (解释:?\v 模式下直接表示 0 或 1 次,无需 \?

总结提示

  • 默认模式 (magic)^ $ . * 是特殊的;+ ? { } ( ) | 需要加 \ 才是特殊的。
  • 推荐习惯:在搜索或替换命令中,如果正则比较复杂,直接使用 \v 开头(例如 /\vpattern),这样可以减少转义字符的使用,使表达式更易读。
  • 帮助文档:在 Vim 中输入 :help pattern 可以查看最权威和详细的说明。
posted @ 2026-03-10 17:16  庶旁  阅读(2)  评论(0)    收藏  举报