分类: LINUX
2008-11-15 14:15:25
[翻译]
" \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
" 查找多行。\_ 表示包括新行
/ : 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.
2. ?
3. VIM帮助文件
4.
[尾记]
本文可以自由应用于非商业用途。转载请注明出处。