[翻譯]
" /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/
[尾記]
本文可以自由應用於非商業用途。轉載請註明出處。