[]
通配符,表示只可以匹配左右方括号内列表的字符。例如t[aeiou]n
将匹配一个小写元音字符,可以找到tan,ten,tin,ton,tun。
在方括号内,可以通过短横线来指明包括字符或数字的序列(collating sequence)。例如[0-9]
可以匹配0到9中的任一数字。也可以将数字与字符相组合,例如[0-9aeiou]
可以匹配任意一个数字或是小写的元音字符。
如果希望匹配“-”本身,那么需要使用反斜杠进行转义。例如表达式one[\-]way
可以匹配one-way,但不会匹配one way。
如果方括号内的列表以^
开头,那么则表示匹配该列表以外的所有字符。例如[^a-zA-Z]
将匹配所有非字母字符。
如果希望匹配“^”本身,那么只需要将其放置在非开头位置即可。例如[@^#]
将匹配@^#中的任一符号。
[abc] | 匹配a,b或是c |
[^abc] | 匹配除abc以处的字符 |
[a-z] | 匹配从a到z的所有小写字符 |
[A-Z] | 匹配从A到Z的所有大写写字符 |
[a-zA-Z] | 匹配所有大小写字符 |
^
通配符,可以排除指定的字符。
acme[^0-9]
匹配所有包含acme,后跟一个非数字字符的行。但不会匹配以acme结尾的行,因为模式中的acme之后必须有一个字符。
[^\x00-\x7F]
匹配所有非ASCII字符(比如中文字符)。
^[^a-zA-Z]
匹配以非字母开头的行,但不会匹配空行,因为行中必须有一个非字母字符存在。
如果需要匹配"^"本身,那么需要使用反斜杠进行转义。例如表达式2[\^*]4
可以匹配2^4和2*4。
{minimum,maximum}
表达式指出一个字符重复的次数。例如表达式a\{3,5}
可以匹配3到5个a(aaa,aaaa,aaaaa)。Vim默认是会尽可能多地进行匹配(Matching as much as possible)。在表达式中,最小次数是可以省略的,即默认最小次数为0,所以表达式a\{,5}
可以匹配0到5个a。最大次数也是可以省略的,即默认匹配无穷大,所以表达式a\{3,}
最少可以匹配3个a,最多个数没有限制。
{number}
表达式只指定一个数字,Vim就会精确的匹配相应的次数。例如a\{5}
只会精确的匹配5次。
{-minimum,maximum}
在数字前增加一个负号(-),那么Vim在查找时就会尽可能少地进行匹配(Matching as little as possible)。例如ab\{-1,3}
将只匹配 "abbb"中的"ab"。表达式a\{-3,}
可以匹配三个或是更多个a,但尽可能少地进行匹配。而表达式a\{-,5}
可以匹配0到5个字符。
表达式a\{-5}
将会精确的匹配5个字符。
* | 匹配0次或是多次,尽可能多的匹配 |
\+ | 匹配1次或是多次,尽可能多的匹配 |
\= | 匹配0次或是1次 |
\{} | 匹配0次或是多次 |
\{n} | 精确匹配n次 |
\{-n} | 匹配n次 |
\{n,m} | 匹配n次到m次 |
\{n,} | 匹配n次到多次 |
\{,m} | 匹配0次到m次 |
\{-n,m} | 匹配n次到m次,尽可能少的进行匹配 |
\{-n,} | 至少匹配n次,尽可能少的进行匹配 |
\{-,m} | 匹配0到m次,尽可能少的进行匹配 |
{-} | 匹配0次到多次,尽可能少的进行匹配 |
以下表达式,将匹配10位数的电话号码:
(\d\{3})[-[:space:]]\?\d\{3}-\d\{4}
格式 | 示例 | ||||||
---|---|---|---|---|---|---|---|
( | 3位数字 | ) | 3位数字 | - | 4位数字 | (800)555-1212 | |
( | 3位数字 | ) | □ | 3位数字 | - | 4位数字 | (800) 555-1212 |
( | 3位数字 | ) | - | 3位数字 | - | 4位数字 | (800)-555-1212 |
您可以使用:help /\{
和:help /\{-
命令,查看相关帮助信息。
|
用于查找两个或是多个可能的匹配。例如表达式foo\|bar
可以找到foo或是bar。我们可以连接使用多个或操作符。例如表达式Larry\|Moe\|Curly
将找到Larry、Moe和Curly。而表达式end\(if\|while\|for\)
则可以匹配"endif", "endwhile" 和 "endfor"几个不同的元素组合。
如果希望匹配多次,那么可以组合使用加号和括号运算符。例如表达式/\(foo\|bar\)\+
可以匹配 "foo", "foobar", "foofoo", "barfoobar"等等。
\a | 大小写字母字符 [a-zA-Z] |
\A | 除了a-zA-Z以外的字母字符 |
\b | <BS> |
\d | 数字字符(digit) [0-9] |
\D | 非数字字符 [^0-9] |
\e | <ESC> |
\f | 由isfname选项定义的文件名字符 |
\F | 由isfname选项定义的文件名字符,但是不包含数字 |
\h | 单词的头字符(A-Za-z) |
\H | 不是单词的头字符(A-Za-z) |
\i | 由isident选项定义的字符 |
\I | 由isident选项定义的字符,但是不包括数字 |
\k | 由iskeyword选项定义的关键字字符 |
\K | 由iskeyword选项定义的关键字字符,但是不包括数字 |
\l | 小字字符 [a-z] |
\L | 非小写字符 [^a-z] |
\n | 行尾符(The end of line character) |
\o | 八进制数字 |
\O | 非八进制数字 |
\p | 由isprint选项定义的可打印字符 |
\P | 由isprint选项定义的可打印字符,但是不包括数字 |
\r | <CR> |
\s | 空白符<Space>和<Tab> [ ] |
\S | 非空白符 [^ ] |
\t | <Tab> |
\u | 大写字母字符 [A-Z] |
\U | 非大写字母字符 [^A-Z] |
\w | 单词字符(0-9A-Za-z) |
\W | 非单词字符 |
\x | 十六进制数字 [0-9a-fA-F] |
\X | 非十六进制数字 [^0-9a-fA-F] |
\~ | 匹配最后指定的字符串 |
表达式\a
匹配任意字符,而表达式\a\a\a
则可以匹配任意三个字符。而\a\a\a_
则可以匹配任意后带一个下划线的三个字符。
操作符\d
可以匹配任意数字;\d\d\d\d
则可以匹配任意四个数字(即使其为更长数字串中的一部分)。
如果希望精确匹配四位数字,那么可以使用以下任一命令:
/\<\d\d\d\d\>
/\<\d\{4}\>
\u
可以匹配任意大写字符;\U
则可以匹配任意非大写字符。使用以下命令,可以将整篇文本替换为大写字母:
:%s/.*/\U&/
如果需要找出包含空格的空行,那么可以使用^\s.*$
表达式;如果需要找到没有空格的空行,则可以使用\S
\s\+$
可以匹配尾部的空格; \+\ze\t
则可以匹配Tab制表符之前的空格。(请注意,此表达式开头为空格)
请注意,以上预定义字符是不能内嵌在[]中使用的。例如,表达式[\d\l]是错误的,应使用\(\d\|\l\)
表达式匹配数字或小写字符。
如果想要查找所有大写字符,可以使用表达式[A-Z]
,或者使用预定义的字符类[:upper:]
。使用/[[:upper:]]
命令可以匹配所有大写字母;而使用/[[:upper:][:lower:]]
命令则可以匹配包括大写和小写字母在内的所有字母。
[:alnum:] | 匹配所有的字母和数字 |
[:alpha:] | 匹配所有的字母 |
[:ascii:] | 匹配所有的ASCII字符 |
[:backspace:] | 匹配退格符<bs> |
[:blank:] | 匹配空格和Tab |
[:cntrl:] | 匹配所有的控制字符 |
[:digit:] | 匹配所有的数字 |
[:escape:] | 匹配Esc |
[:graph:] | 匹配所有可打印字符(不包括空格) |
[:lower:] | 匹配所有的小写字母 |
[:print:] | 匹配所有可打印字符(包括空格) |
[:return:] | 匹配所有的行末符号(包括<Enter>,<CR>,<NL>) |
[:punct:] | 匹配所有的标点符号 |
[:space:] | 匹配所有的空白符 |
[:tab:] | 匹配Tab |
[:upper:] | 匹配所有的大写字母 |
[:xdigit:] | 匹配十六进制数字 |
使用/^[[:digit:]]
命令,可以查找所有以数字开头的行。
假设希望将以下句子中以“w”开头并以“ll”结尾的字符串,替换为“XXX”。
I will roll the wheel from the whalebelly to the well.
如果使用:s/w.*ll/XXX/g
命令进行替换,由于Vim默认是会尽可能多地进行匹配(Matching as much as possible),即会替换从第一个“w”开始至末尾“ll”之间的所有字符,结果为:
I XXX.
使用以下命令排除空格和标点符号,从而达到更精确的匹配:
:s/w[^[:space:][:punct:]]*ll/XXX/g
I XXX roll the wheel from the XXXy to the XXX.
如果需要查找某些特殊符号(比如美元符号),那么可以使用反斜杠backslash(\)进行转义。
\. | 匹配点(A literal period) |
\\ | 匹配反斜杠(A literal backslash) |
\/ | 匹配斜杠(A literal forward slash) |
\^ | 匹配脱字符(A literal carat) |
\$ | 匹配美元符号(A literal dollar sign) |
例如以下命令,将点替换为分号时需要进行转义:
:%s/\./;/g
可以使用以下命令,查看关于查找模式的更多帮助信息:
:help pattern