[翻译]
" /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”不匹配任何东西,因为它要求在foobar的b字母开始的位置上匹配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/
[尾记]
本文可以*应用于非商业用途。转载请注明出处。