Best of VIM Tips(译注) - 连载3 查找(b) vim正则表达式D语言J#.net
这一节主要是在查找中使用正则表达式。VIM提供了强大的正则表达式机制,灵活的应用它可以显著的提高工作效率。
正则表达式的帮助入口为“:help pattern”。
[翻译]
/^joe.*fred.*bill/ : normal
标准的正则表达式
[注解]
:help /^
:help /.
:help /star
这是一个最简单的正则表达式,查找行首为joe,包含fred和bill单词的行
其中,“.”代表任意字符,“*”表示在它之前的字符重复任意次(包括0次),所以“.*”的含义就是任意个任意字符。“*”可以表示0次匹配,也就是它前面的字符允许不出现。
“^”字符表示该匹配由行首位置开始。
[翻译]
/^[A-J]\+/ : search for lines beginning with one or more A-J
查找以一个或多个 A-J 中的字母开头的行
[注解]
:help /[]
:help /\+
这个正则表达式匹配以一个或多个A-J中的字母开头的行。
它用到了集合表示法“[]”。任何出现在“[]”中的字母都符合匹配。如果“[]”中的第一个字符是“^”,则表示“[]”中的字母都不符合匹配。
“\+”表示它前面的字符出现一次或多次,它与“*”的区别在于“*”允许它前面的字符出现0次。
[翻译]
/begin\_.*end : search over possible multiple lines
查找在 begin 和 end 两个单词之间尽可能多的行
[注解]
:help /\_.
这个正则表达式可以跨行匹配。一般情况下正则表达式只在一行内进行匹配,但如果使用了“\_.”这类标记,它就可以在多行间进行匹配。
“\_.”匹配任意单个字符和换行符,它于“.”的区别在于它可以匹配换行符。
[翻译]
/fred\_s*joe/i : any whitespace including newline
查找在 fred 和 joe 两个单词之间任意多的空白字符,包括新行
[注解]
:help /\s
:help /\_s
这个正则表达式跨行空白字符。所谓空白字符,包括空格以及制表符。
“\_s”匹配空白字符和换行符。“\s”则只匹配空白字符。
现在我们深入一点,“\s”匹配空白字符,而“\_s”匹配空白字符和换行符;“.”匹配任意单个字符,而“\_.”匹配任意单个字符和换行符。总结出规律没有?!
该表达式最后的字符i,没有找到其具体含义。
[翻译]
/fred\|joe : Search for FRED OR JOE
查找 fred 或 joe
[注解]
:help /\bar
这个正则表达查找符合fred或符合joe。
“\|”用来连接正则表达式的两个子式,两个子式间是或的关系。
[翻译]
/.*fred\&.*joe : Search for FRED AND JOE in any ORDER!
查找同时包含 FRED 和 JOE 的行,不分前后顺序
[注解]
:help /\&
这个正则表达式查找“.*joe”,但同时要求这一行中必须包含“.*fred”。
“\&”用来连接正则式的两个子式。它匹配最后一个子式,但要求之前的子式也在同样的位置被匹配,也就是两个子式间是与的关系。这个操作符理解起来可能有些难。
注意,如果你把上面的查找换成“/fred\&joe”,那么它不能匹配到任何东西。因为任何匹配joe的字串,在j的位置,都不可能匹配f。
和C语言中的&、|符类似,VIM中的“\&”优先级要高于“\|”,所以会先计算“\&”子式再计算“\|”子式。
[翻译]
/\<fred\>/i : search for fred but not alfred or frederick
查找 fred, 而不是 alfred 或者 frederick,也就是全字匹配
[注解]
:help /\<
:help /\>
:help 'iskeyword'
这个正则表达式匹配完整的fred单词。在VIM中,'iskeyword'选项定义了哪些字符是组成单词的字符。这个正则式要求在fred之前的字符,以及在fred之后的字符,都不在'iskeyword'选项中。
“\<”匹配单词的起点,“\>”匹配单词的终点。
[翻译]
/\<\d\d\d\d\> : Search for exactly 4 digit numbers
查找4个数字的全字匹配
[注解]
:help /\d
这个正则式全字匹配4个数字。
“\d”匹配0-9间的任一数字。
[翻译]
/\D\d\d\d\d\D : Search for exactly 4 digit numbers
查找4个数字的全字匹配
[注解]
:help /\D
这个正则式和上面一样,也全字匹配4个数字。
“\D”匹配非数字。
[翻译]
/\<\d\{4}\> : same thing
同上
[注解]
:help /\{
这个正则式和上面两个一样,全字匹配4个数字。
“\{4}”表示匹配它前面的字符4次。
[翻译]
/\([^0-9]\|^\)%.*% : Search for absence of a digit or beginning of line
查找
[注解]
:help /\(
这个正则式组合使用了前面介绍的操作符,理解起来有些复杂。
“\( \)”的作用是把括号里面的内容当做一个单一的元字符。括号里可以包含正则式,但用这种转义括号包起来时,会把这个正则式当做一个元字符。例如,“*”字符的含义它前面的字符出现任意次。如果“*”用在“\( \)”后面时,就会表示“\( \)”中的正则式出现任意次,也就是把“\( \)”中的内容当做一个元字符来处理。
所以对上面的这个表达式来讲,会把“\( \)”中的表达式和“%.*%”结合起来进行查找,而“\( \)”中的表达式是或的关系,因此这个正则式实际可以拆分为下面两个正则式的或运算:“[^0-9]%.*%”及“^%.*%”。
这样拆分后,我们就很容易搞懂它的含义了。第一个正则式查找%前为非数字,在它后面还有一个%的匹配;第二个正则式查找行首是%,它后面还有另外一个%的匹配;这两个表达式再进行或运算,也就是查找满足第一个正则式的匹配,或者满足第二个正则式的匹配,满足两者中任一个即匹配成功。
[参考文档]
1. http://www.rayninfo.co.uk/vimtips.html
2. http://groups.google.com/group/Vim-cn/msg/f72fba0645955101?
3. VIM帮助文件
4. http://vimcdoc.sourceforge.net/
[尾记]
本文可以*应用于非商业用途。转载请注明出处。