📄 usr_27.cnx
字号:
\{0,} 0 或 更多,同 * \{1,} 1 或 更多,同 \+ \{3} 3匹配尽可能少的字符迄今为止,我们所讨论过的都试图匹配尽可能多的字符。若要匹配尽可能少的字符,请用 "\{-n,m}"。它的用法跟 "\{n,m}" 一样,唯一的区别在于,它采用尽可能少的字符。 例如,以下命令: > /ab\{-1,3}将匹配 "abbb" 中的 "ab"。实际上,因为没理由匹配更多,所以它永远不会匹配超过一个 b。它需要其它的来强制它超过其下限规定次数,而匹配更多的重复。 这些同样的规则也适用于省略 "n" 和 "m" 的情形。甚至可以把两个都省略,只剩"\{-}"。这个项匹配其前项的重复,重复次数尽可能少,可以等于或大于零。这个项如单独使用,则总是匹配前项的零次重复。当它跟与其它的模式合起来时,用处就大了。例如: > /a.\{-}b这个命令匹配 "axbxb" 中的 "axb"。如果采用了下面这个模式: > /a.*b由于 ".*" 匹配尽可能多的字符,整个 "axbxb" 都会被匹配。==============================================================================*27.5* 多择一在一个查找模式中,"或" 运算符是 "\|"。例如: > /foo\|bar这个命令匹配了 "foo" 或 "bar"。更多的抉择可以连在后面: > /one\|two\|three匹配 "one","two" 或 "three"。 如要匹配其多次重复,那么整个抉择结构须置于 "\(" 和 "\)" 之间: > /\(foo\|bar\)\+这个命令匹配 "foo","foobar","foofoo","barfoobar",等等。 再举个例子: > /end\(if\|while\|for\)这个命令匹配 "endif","endwhile" 和 "endfor"。一个与此相关的项是 "\&"。它要求两个抉择都与同一位置的文本相符。而最终匹配的则是最后面的那个抉择。例如: > /forever\&...这个命令匹配 "forever" 中的 "for" (译者: 因为第二抉择要求三个字符)。它将不匹配,比如说 "fortuin" (译者: 不符合第一抉择)。==============================================================================*27.6* 字符域你可以用 "/a\|b\|c" 来匹配 "a","b" 或 "c"。当你需要匹配自 "a" 至 "z" 所有的字母时,以这样的方式表达就嫌长了。这里有个比较简短的表达方式: > /[a-z]方括号结构 [] 匹配单个字符。你在括号内指定哪些字符可以匹配。你可以把一系列字符包含在内,像这样: > /[0123456789abcdef]这个命令将匹配其中的任何一个字符。你可以为一系列连续字符规定一个字符域。"0-3" 表示 "0123"。"w-z" 表示 "wxyz"。因此,上面那个命令可以缩短为: > /[0-9a-f]若要匹配字符 "-" 本身,就得把它放在字符域的第一或最后的位置上。Vim 会识别下面这些特殊字符,以便在 [] 字符域里使用它们较为方便 (它们实际上可被用于任何查找模式的任何地方): \e <Esc> \t <Tab> \r <CR> \b <BS>还有若干特殊场合用得上 [] 字符域,参阅 |/[]| 以了解全部用法。补 域为了避免匹配到一个特定的字符,在字符域首位使用 "^"。这样方括号项 [] 就会匹配任何括号内不包括的字符。例如: > /"[^"]*"< " 双引号 [^"] 双引号以外的任何字符 * 尽可能多个 " 又一个双引号这个命令匹配 "foo" 和 "3!x",包含双引号在内。预 定 义 的 域有些字符域使用得很频繁。Vim 为这些字符域提供了一些捷径。例如: > /\a这个命令找寻字母字符。这相当于使用 "/[a-zA-Z]"。下面还有几个这样的字符域: 项 匹配 相当于 ~ \d 数码 [0-9] \D 非数码 [^0-9] \x 十六进制数 [0-9a-fA-F] \X 非十六进制数 [^0-9a-fA-F] \s 空白字符 [ ] (<Tab> 和 <Space>) \S 非空白字符 [^ ] (非 <Tab> 和 <Space>) \l 小写字母 [a-z] \L 非小写字母 [^a-z] \u 大写字母 [A-Z] \U 非大写字母 [^A-Z] Note: 使用这些预定义的字符域要比使用它们所表示的那个字符域快很多。 这些项不能用于 [] 方括号内。因此 "[\d\l]" 不能用来匹配一个数字或一个 小写字母。请换用 "\(\d\|\l\)"。|/\s| 包括一个这类域的完整的列表。==============================================================================*27.7* 字符类一个特定的字符域匹配一组固定的字符。一个字符类与字符域相似,不过有个本质的区别: 一个字符类代表的那组字符可以重新定义而无须改动查找模式。 例如,查找这个模式: > /\f\+其中 "\f" 项表示文件名字符。因而这个命令匹配一个由可用作文件名的字符字符组成的序列。 哪些字符可以用来组成文件名取决于你所使用的系统。在微软视窗上,反斜线符可以,而在 Unix 上却不行。文件名字符由 'isfname' 选项来规定。在 Unix 上,该选项的默认值为: > :set isfname isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=在其它系统上,其默认值各不相同。因此你可以用 "\f" 组成一个查找模式,以匹配一个文件名。该查找模式将自动调整以适应你所使用的系统。 Note: 实际上,Unix 允许在文件名里使用几乎所有的字符,包括空格字符。把这些字 符包括在 'isfname' 里,在理论上是没错的。但那样就无法在文本中发现一个 文件名在哪儿结束。因此选项 'isfname' 的默认值是个折衷方案。字符类有如下这些: 项 匹配 选项 ~ \i 标识符字符 'isident' \I 类似于 \i,但不包括数字 \k 关键词字符 'iskeyword' \K 类似于 \k,但不包括数字 \p 可打印字符 'isprint' \P 类似于 \p,但不包括数字 \f 文件名字符 'isfname' \F 类似于 \f,但不包括数字==============================================================================*27.8* 匹配换行符Vim 能找寻含有换行符的模式。你需要指定换行符在哪儿出现,因为迄今为止所有我们曾经提到过的项,都不匹配换行符。 用 "\n" 项可以在一个特定的位置查验一个换行符: > /the\nword这个命令将在一行以 "the" 结尾,而下一行以 "word" 开头的地方找到匹配。如果还要匹配 "the word",那么你需要匹配一个空格或一个换行符。这可以用 "\_s" 表示: > /the\_sword若要允许任意数量的空格: > /the\_s\+word这个命令也匹配 "the " 在行尾,及 " word" 在下一行行首的情形。"\s" 匹配空格字符,"\_s" 匹配空格字符或一个换行符。同理,"\a" 匹配一个字母字符,而 "\_a" 匹配一个字母字符或一个换行符。其它字符类和字符域都可以通过插入一个 "_" 来更改其范围。很多别的项也可以在前面加 "\_" 以匹配一个换行符。例如: "\_." 匹配任意字符或一个换行符。 Note: "\_.*" 匹配任何字符,直至文件结束。要小心,它会使查找命令执行得非常缓慢。另一个例子是 "\_[]",一个包含了换行符的字符域: > /"\_[^"]*"这个命令找寻位于一对双引号之间,可能分隔成数行的文本。==============================================================================*27.9* 举例这儿有几个查找模式,你也许会觉得有用。本节向你演示如何综合使用前面提及的那些用法。寻 找 一 个 加 州 驾 驶 牌 照有一个驾驶牌照号码为 "1MGU103"。它有一个数字,三个大写字母,然后三位数字。直接把这个号码放入查找模式: > /\d\u\u\u\d\d\d另一种方法是用一个计数器来指定其中有三个数字和三个字母: > /\d\u\{3}\d\{3}换用 [] 字符域方法: > /[0-9][A-Z]\{3}[0-9]\{3}这些方法之中你应该使用哪一种? 挑那种你记得住的。你记得住的简单方法要比你记不住的华丽方法快得多。如果你能把它们都记住,那么避免使用最后那种,因为它要打的字多,而且执行起来慢。寻 找 一 个 标 识 符在 C 程序里 (以及其它很多计算机程序) 一个标识符以字母开头,其余部分由字母和数字组成。下划线字符也可以。这样一个标识符可以用下面的命令找到: > /\<\h\w*\>"\<" 和 "\>" 用来寻找那些完整的词。"\h" 表示 "[A-Za-z_]",而 "\w" 则表示 [0-9A-Za-z_]"。 Note: "\<" 和 "\>" 取决于 'iskeyword' 选项。如果这个选项包括 "-" 的话,那么 "ident-" 就不匹配了。在这种情况下,请用: > /\w\@<!\h\w*\w\@!< 这个命令查验是否 "\w" 不匹配标识符之前或之后的字符。 参见 |/\@<!| 和 |/\@!|。==============================================================================下一章: |usr_28.txt| 折叠版权: 参见 |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -