Best of VIM Tips(译注) - 连载5 查找(d)

时间:2022-09-13 00:01:34

[翻译]

" /zs and /ze regex delimiters :h //zs

" /zs/ze正则表达式符号,:h //zs

/</zs[^>]*/ze>              : search for tag contents, ignoring chevrons

                              查找XML标记的内容,忽略尖括号

[注解]

                                                                                                    :help //zs

                                                                                                    :help //ze

这个正则表达式匹配位于“<>”间的内容,但不匹配“<”和“>”这两个字符。

其中,“/zs”指明匹配在此处开始,“/ze”指明匹配在此处结束。

 

[翻译]

" zero-width :h //@=

"零长度 :h //@=

/</@<=[^>]*>/@=             : search for tag contents, ignoring chevrons

                              查找XML标记的内容,忽略尖括号

/</@<=/_[^>]*>/@=           : search for tags across possible multiple lines

                              查找可能越过多行的XML标记

[注解]

                                                                                                    :help /@<=

                                                                                                    :help /@=

这两个正则表达式理解起来有难度,要讲清楚也不容易。

像“/@<=”、“/@=”、“/<”、“/>”、“/zs”、“/ze”这类的元字符,并不匹配任何实际字符,它们只是用来检查匹配是否存在。正则表达式在进行匹配时,需要满足它们所规定的条件。因为它们不匹配实际字符,所以称它们为匹配零长度的元字符。

/<”和“/>”匹配单词的开始和结束。

/zs”和“/ze”表示匹配的开始和结束。

/@<=”要求前面的元字符刚好出现在它后面的匹配模式之前。它只是用来检查这个条件,它前面的元字符并不会包含在匹配结果中。

/@=”匹配它前面的元字符,但匹配长度为0。也就是说,它只检查前面的元字符是否存在,并不把前面的元字符包含在匹配结果中。在它后面出现的元字符,将在与它前面的元字符相同的位置被匹配。举个例子,“foo/(bar/)/@=”匹配foolbar单词中的foo,但不会匹配fool。而“foo/(bar/)/@=foo”不匹配任何东西,因为它要求在foobarb字母开始的位置上匹配foo,这显然是不可能的。“foo/(bar/)/@=…”会匹配到foobar而不会匹配foobbb,想一想为什么?

对于正则式“</@<=[^>]*>/@=”来说,“/@<=”的作用是要求“<”必须出现在“[^>]*”模式之前,但匹配是从“[^>]*”开始的;而“/@=”表示必须有“>”出现,但并不把“>”包含在匹配结果中(零长度匹配)。所以这个表达式的效果和上面的“</zs[^>]*/ze>”是相同的。

                                                                                                    :help //_[]

/_[]”匹配集合中的元字符和换行符。我们在前面介绍过“/_.”和“/_s”,它们都是在原有的匹配上增加了换行符。这是VIM正则表达式的扩展。

 

[翻译]

"searching over multiple lines /_ means including newline

" 查找多行。/_ 表示包括新行

/<!--/_p/{-}-->                : search for multiple line comments

                                     查找多行注释

[注解]

                                                                                                    :help /p

                                                                                                    :help /_p

                                                                                                    :help //{-

这个正则表达式查找跨行的XML注释。

其中“/p”代表可显示字符,“/_p”在“/p”基础增加了换行符的匹配。

/{-}”匹配前面的元字符,尽可能少。它和“*”的区别是,“*”会尽可能多的匹配它前面的元字符。

 

[翻译]

/fred/_s*joe/i                    : any whitespace including newline

                                     查找在 fred joe 两个单词之间任意多的空格,包括新行

[注解]

见前。

 

[翻译]

/bugs/(/_./)*bunny                : bugs followed by bunny anywhere in file

                                     bugs 后任意位置含有 bunny 单词的多个行

[注解]

见前。

 

[翻译]

:h /_                             : help

                                     帮助

[注解]

                                                                                                    :help /_

帮助入口。

 

[参考文档]

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/

 

[尾记]

本文可以*应用于非商业用途。转载请注明出处。

原文链接:http://blog.csdn.net/easwy