[翻譯]
" /zs and /ze regex delimiters :h //zs
" /zs和/zeRegex符號,:h //zs
/</zs[^>]*/ze> : search for tag contents, ignoring chevrons
尋找XML標記的內容,忽略角括弧
[註解]
:help //zs
:help //ze
這個Regex匹配位於“<>”間的內容,但不匹配“<”和“>”這兩個字元。
其中,“/zs”指明匹配在此處開始,“/ze”指明匹配在此處結束。
[翻譯]
" zero-width :h //@=
"零長度 :h //@=
/</@<=[^>]*>/@= : search for tag contents, ignoring chevrons
尋找XML標記的內容,忽略角括弧
/</@<=/_[^>]*>/@= : search for tags across possible multiple lines
尋找可能越過多行的XML標記
[註解]
:help /@<=
:help /@=
這兩個Regex理解起來有難度,要講清楚也不容易。
像“/@<=”、“/@=”、“/<”、“/>”、“/zs”、“/ze”這類的元字元,並不匹配任何實際字元,它們只是用來檢查匹配是否存在。Regex在進行匹配時,需要滿足它們所規定的條件。因為它們不匹配實際字元,所以稱它們為匹配零長度的元字元。
“/<”和“/>”匹配單詞的開始和結束。
“/zs”和“/ze”表示匹配的開始和結束。
“/@<=”要求前面的元字元剛好出現在它後面的匹配模式之前。它只是用來檢查這個條件,它前面的元字元並不會包含在匹配結果中。
“/@=”匹配它前面的元字元,但匹配長度為0。也就是說,它只檢查前面的元字元是否存在,並不把前面的元字元包含在匹配結果中。在它後面出現的元字元,將在與它前面的元字元相同的位置被匹配。舉個例子,“foo/(bar/)/@=”匹配foolbar單詞中的foo,但不會匹配fool。而“foo/(bar/)/@=foo”不匹配任何東西,因為它要求在foobar的b字母開始的位置上匹配foo,這顯然是不可能的。“foo/(bar/)/@=…”會匹配到foobar而不會匹配foobbb,想一想為什嗎?
對於正則式“</@<=[^>]*>/@=”來說,“/@<=”的作用是要求“<”必須出現在“[^>]*”模式之前,但匹配是從“[^>]*”開始的;而“/@=”表示必須有“>”出現,但並不把“>”包含在匹配結果中(零長度匹配)。所以這個運算式的效果和上面的“</zs[^>]*/ze>”是相同的。
:help //_[]
“/_[]”匹配集合中的元字元和分行符號。我們在前面介紹過“/_.”和“/_s”,它們都是在原有的匹配上增加了分行符號。這是VIMRegex的擴充。
[翻譯]
"searching over multiple lines /_ means including newline
" 尋找多行。/_ 表示包括新行
/<!--/_p/{-}--> : search for multiple line comments
尋找多行注釋
[註解]
:help /p
:help /_p
:help //{-
這個Regex尋找跨行的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