Vim 学习手记(五) --- 搜索: 简述Vim中的正则表达式

 2010年01月15日 星期五 22:37 | 1371次浏览 | 0条评论


在没有 ctags 的黑暗时期,这些技巧比什么都来得重要。

正则表达式是非常有用的工具。一个程序员,可以不会 Vim , 但不能不会正则表达式。
这里只列出 Vim 中调用常用元字符的方式。

使用正则表达式的命令
使用正则表达式的命令最常见的就是 / (搜索)命令。其格式如下:
/正则表达式
另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正则表达式替换成第二个//之间的字符串。
:s/正则表达式/替换字符串/选项
在学习正则表达式时可以利用 / 命令来练习。
元字符
元字符是具有特殊意义的字符。使用元字符可以表达任意字符、行首、行尾、某几个字符等意义。
元字符一览
元字符
说明
.
匹配任意一个字符
[abc] 匹配方括号中的任意一个字符。可以使用-表示字符范围, 如[a-z0-9]匹配小写字母和阿拉伯数字。
[^abc] 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。
\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_]。
\t 匹配字符。
\s 匹配空白字符,等同于[ \t]。
\S 匹配非空白字符,等同于[^ \t]。
另外,如果要查找字符 *、.、/等,则需要在前面用 \ 符号,表示这不是元字符,而只是普通字符而已。

元字符
说明
\* 匹配 * 字符。
\.  匹配 . 字符。
\/ 匹配 / 字符。
\\ 匹配 \ 字符。
\[ 匹配 [ 字符。
* 匹配0-任意个
\+ 匹配1-任意个
\?  匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个
$ 匹配行尾
^ 匹配行首
\ 匹配单词词首
\> 匹配单词词尾

替换变量
在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 \( 和 \) 中的内容

函数式
在替换命令 s/// 中可以使用函数表达式来书写替换内容,格式为
:s/替换字符串/\=函数式
在函数式中可以使用 submatch(1)、submatch(2) 等来引用 \1、\2 等的内容,而submatch(0)可以引用匹配的整个内容。

//忽略大小写
:set ignorecase

如果你只想对搜索模式的一部分应用大小写不敏感的策略, 可以在它前面加上一个"\c". 使用"\C"会使大小写敏感

//不循环搜索
默认情况下, 一个向前的搜索会从当前光标开始, 直到找到目标或达到文件

要关闭越过文件头尾的循环搜索, 可以使用下面的命令:
:set nowrapscan


//偏移
默认情况下, 搜索到一个目标后光标会停留在目标字符串的第一个字符上. 你也可以告诉Vim此时要如何放置光标. 对于向前搜索命令"/"来说, 指定一个偏移可以通过在模式最后再加上一个/符号, 紧接着指定你要的偏移.
/default/2

这个命令会搜索模式"default", 找到后将光标停留在目标行向下的第2行

它会"e"指示光标在找到目标串之后以它的结尾作为移动的起始处.
把光标置于目标字符串的最后一个字符, 命令:
/const/e

下面的命令将光标置于目标字符串的结尾处的下一个字符:
/const/e+1

  如果偏移指示符是以"b"开始的, 则光标移动到目标字符串的开头.
这个用处不大, 因为默认就是如此. 只有在加减一个数时它才显得有用.此时光标从目标字符串的开头左右偏移


//反向搜索
对"?"命令而言使用偏移也毫无二致. 但是你必需以"?"来分隔命令的不同部分:
?const?e-2


//重复
要重复前一个搜索但应用不同的偏移, 可以空出模式部分:
/that
//e

完全重复一个搜索:
/
"n"命令与此相同

要继续查找但移除前面使用的偏移效果, 用
//


//指定重复次数
要指定重复的次数, 可以使用"\{n,m}"这样的形式. "n" 和"m"代表数字. 其前的项会被匹配"n"次到"m"次
/ab\{3}
匹配 3 次
如果"n"被忽略了就默认它为0,如果"m"被忽略了就默认它为无穷大目前为止, 所有的重复项都是"贪婪"地匹配所能找到的字符. 要尽可能少次数地重复一个项, 使用"\{-n,m}". 它跟"\{n,m}"一样, 只是在匹配时尽可能少次数地重复

例如, 用命令:
/ab\{-1,3}
将会匹配到"abbb"中的"ab". 实际上, 它永远都不会匹配多于一个
的b

对"n"或"m"一方缺角的情况也一样. 甚至两个上下限都没有指定时也一样, 如"\{-}".它匹配它前面的项一次或0次, 尽可能地少跟其它东西联合使用时这一功能十分有用.如:
/a.\{-}b
它会匹配到"axbxb"中的"axb"


//多选一
在一个模式中的"或"操作符是"\|"
/one\|two\|three
匹配到"one", "two" 和"three"
/\(foo\|bar\)\+
这可以匹配到"foo", "foobar", "foofoo", "barfoobar", 等等

看另一个例子:
/end\(if\|while\|for\)
匹配的是"endif", "endwhile" 和"endfor"

另一个与此相关的项是"\&". 它要求两个并列的选项同时被被匹配到
最终的匹配结果将是最后一个并列项. 如:
/forever\&...
但不会匹配到"fortuin"中的"for"1 .将只会匹配"forever"中的"for".
首先forever这个被匹配到,然后3个任意字符一定会被匹配到,实际上就是for,最终被匹配的是for,所以如果搜索命令是
/forever&.../e
则光标将停留在字母for中的r上


//字符范围
如果你要匹配的是从"a"到"z"的 所有26个字母这个模式就会变得很长很长... 下面是另一种更为简短的表示法:
/[a-z]
[]这种结构只匹配到一个单个的字符

"0-3"代表"0123". "w-z"代表"wxyz". 所以整个命令可以写为:
/[0-9a-f]

要避免匹配到某个特殊的字符, 在[]字符集的开头用"^"可以指定
除[]中指定的所有字符之外的字符


//预定义字符集
由于字符集合在Vim中被广泛使用.所以Vim提供了另一种快捷的表示:
/\a
查找所有的字母字符. 等同于"/[a-zA-Z]"1 . 的类集表示:
                 List
特殊项    匹配什么    等价的正则表达式
\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]


"\f"项代表组成文件名的字符. 这个模式可以匹配到一个看似文件名的字符串 这些字符类还包括
                List
项    匹配什么    对应的选项
\i    标识符字符    'isident'
\I    同于\i, 但排除了数字
\k    关键字字符    'iskeyword'
\K    同\k, 但排除数字
\p    可打印字符    'isprint'
\P    同\p, 但排除数字
\f    文件名字符    'isfname'
\F    同\f, 但排除数字


//匹配一个断行
要表明某处发生断行, 使用"\n":
/the\nword
要同时匹配"the word", 你需要匹配空格或断行. "\ s"项正是这个的意思:
/the\_sword
下面的例子允许多个的空白字符:
/the\_s\+word
"\s"匹配空白, "\ s"匹配空白或断行. 同样, "\a"匹配一个字母字符, "\ a"匹配一个字母字符或一个断行. 其它的字符类也一样还有很多其它的项都可以通过前辍以"\ "来同时包括断行.以匹配包括断行在内的任何字符

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !

暂时没有评论

Zeuux © 2024

京ICP备05028076号