pattern.txt For Vim version 8.0. 最近更新: 2017年8月 : lang2 http://vimcdoc.sf.net 模式及查找命令 pattern-searches 最基本的東西能夠在用戶手冊的 03.9 節中找到。在 usr_27.txt 也有一些解釋。 1. 查找命令 search-commands 2. 匹配模式的定義 search-pattern 3. 魔術 /magic 4. 模式項總覽 pattern-overview 5. 倍數項 pattern-multi-items 6. 普通匹配原 pattern-atoms 7. 忽略大小寫 /ignorecase 8. 合成用字符 patterns-composing 9. 與 Perl 匹配模式的比較 perl-patterns 10. 高亮顯示匹配 match-highlight VIM 參考手冊 by Bram Moolenaar譯者
/ /[/] 正向查找第 次出現 的地方 ( exclusive 開動做)。 // 正向查找第 次出現 的地方並向上或下移 動 {offset} 行。 linewise 行動做。 /<CR> / 正向查找第 次出現處,使用上次的模式 last-pattern 以及上次的 {offset} 。 // 正向查找第 次出現處,使用上次的模式 last-pattern 以及新偏移 {offset} 。若 爲 空,不使用任何偏移。 ? ?[?] 反向查找第 次出現 的地方 ( exclusive 開動做) ?? 反向查找第 次出現 的地方 並向上或下移動 {offset} 行 linewise 行動做。 ?<CR> ? 反向查找第 次出現處,使用上次的模式 last-pattern 以及上次的 {offset} 。 ?? 反向查找第 次出現處,使用上次的模式 last-pattern 以及新偏移 {offset} 。若 爲 空,不使用任何偏移。 n n 將上次的 "/" 或 "?" 重複 次。 若是光標不移動,搜索重複 count + 1 次。 last-pattern N N 將上次的 "/" 或 "?" 在相反方向上重複 次。 last-pattern star E348 E349 * 正向查找第 次出現距離當前光標最近的單詞的地 方。用於查找的單詞是如下最早符合條件的: 1. 光標所在的關鍵字 'iskeyword' 2. 當前行內的光標後的第一個關鍵字。 3. 光標所在的非空白單詞 4. 當前行內的光標後的第一個非空白單詞 只查找整字,就像使用了命令 "/\<keyword\>" 同樣。 ( exclusive 開動做) 使用 'ignorecase',不使用 'smartcase'。 # # 同 "*",但反向查找。也能夠用磅符號 (字符 163)。若是 "#" 的功能和退格鍵同樣,試着在啓動 Vim 前使用 "stty erase " ( 是 或真的退格鍵)。 gstar g* 同 "*",但不使用 "\<" 和 "\>"。這樣查找就會匹配非整字 的地方。 g# g# 同 "#",但不使用 "\<" 和 "\>"。這樣查找就會匹配非整字 的地方。 gd gd 跳轉 (goto) 至局部聲明 (declaration)。當光標下是一個局 部變量時,此命令會跳轉到該變量被聲明的地方。 首先,Vim 會查找當前函數的起始處,就像使用 "[[" 同樣。 若是找不到會中止在第一行。若是找到, Vim 會反向搜索直 到找到一個空行,而後從這裏開始正向查找光標所在的關鍵 字,就像使用了 "*" 同樣,但看起來像註釋的行會被忽略。 (見 'comments' 選項)。 這並不是總有效。Vim 不會作語法分析。它僅僅查找關鍵 字的匹配。若是頭文件也須要搜索的話,可使用 include-search 列出的命令。 這個命令以後,可使用 n 正向查找下一個匹配 (不能反 向)。 gD gD 跳轉 (goto) 至全局聲明 (Declaration)。當光標下是一個全 局變量時,此命令會跳轉到該變量被聲明的地方。此命令和 "gd" 命令同樣,不過查找老是從第一行開始。 1gd 1gd 同 "gd",但忽略光標位置前結束的 塊裏的匹配。 1gD 1gD 同 "gD",但忽略光標位置前結束的 塊裏的匹配。 CTRL-C 停止當前的 (搜索) 命令。在 MS-DOS 上用 dos-CTRL-Break 。 在普通模式下,任何等待的命令將被終止。 :noh :nohlsearch :noh[lsearch] 中止 'hlsearch' 選項的高亮顯示。若是再執行查找命令或者 設定 'hlsearch' 選項,高亮會自動打開。此命令沒法在自動 命令裏使用,由於高亮的狀態會在自動命令執行期間自動保存 和恢復 autocmd-searchpat 。 執行用戶函數時也是如此。 若是打開 'incsearch' 選項,鍵入查找模式時,即時顯示當前的匹配。不過,你還得用 來結束查找命令並將光標定位到顯示的匹配。也能夠用 來放棄查找。 若是打開 'hlsearch',最後一次查找命令的全部匹配點都會被高亮。用 :nohlsearch 命令來暫停。 若是沒找到匹配,會報錯: E486 Pattern not found 爲 Vi 兼容起見, :global 命令會把此錯誤看成一個普通的消息。 :s 命令的 "e" 標誌位可用來避免此錯誤 :s_flags 。 search-offset {offset} 這些命令查找一個指定的模式。而 "/" 和 "?" 命令還能夠指定一個額外的偏移量。有兩 種偏移: 行偏移和字符偏移。 偏移用來指定光標相對於找到的匹配的位置: 行向下,第一列 + 行向下,第一列 - 行向上,第一列 e 字符向右 (從匹配結束 (end) 處算起) e 字符向左 (從匹配結束 (end) 處算起) s 字符向右 (從匹配開始 (start) 處算起) s 字符向左 (從匹配開始 (start) 處算起) b 等價於 s (從匹配開始 (begin) 處算起) b 等價於 s (從匹配開始 (begin) 處算起) ; 開始另外一項搜索,見 //; 若是給出了 '-' 或 '+' 可是省略了 ,會使用缺省的 1。 若是使用了 'e' 偏移,查找會成爲 inclusive 閉動做 (光標要到達的字符自己會包含 在操做裏)。 示例: /test/+1 "test" 下一行,第一列 /test/e "test" 的後一個 't' /test/s+2 "test" 中的 's' /test/b-3 "test" 前的第三個字符 若是把這些命令之一和一個操做符連用,影響的是查找以前和以後光標位置之間的字符。 然而,若是使用了行偏移,影響的是兩光標位置之間的全部整行。 一個演示如何查找一個模式並用另外一個單詞來更改匹配的例子: //; E386 一個很特別的偏移是 ';' 後面接另外一個查找命令。例如: 其中第一例會先找到下一個出現 "test 1" 的地方,而後尋找在它以後 "test" 的第一次 出現之處。 這就好像接連執行兩次查找命令,不一樣之處在於: - 它能夠被看成操做符以後的單個移動命令。 - 之後的 "n" 或 "N" 命令基於第一個查找操做。 - 當有錯誤時光標原地不動。 last-pattern 最近使用的模式和偏移會被記住。它們能夠用來重複查找,並且查找的方向和計數均可以 修改。 Vim 會記住兩個模式: 一個是普通模式下查找命令用的,另外一個是替代命令 ":s" 用的。每次給出一個空白的模式時,都將用到前次使用模式。不過,若是沒有前次 搜索模式,若是能夠,使用前次替代模式。 'magic' 選項的值是和最近使用模式自己綁定的。若是你改變了 'magic',最近使用模式 的解釋方法不會改變。'ignorecase' 選項就不一樣。當 'ignorecase' 的值改變時,該模 式會匹配另外的文本。 若是你設定了 'hlsearch' 選項,全部最近使用的查找模式的匹配點都會高亮。 要清除最近使用的查找模式: 這不會把該模式設置爲空串,由於那樣會匹配全部的東西。該模式是真的清除了,就像 Vim 剛剛啓動同樣。 查找一般會跳過那些不移動光標位置的匹配。下一次匹配是開始於下一個字符仍是在跳過 那些匹配以後取決於 'cpoptions' 選項中的 'c' 標誌位。見 cpo-c 。 帶 'c' 標誌位: "/..." 前進 1 至 3 個字符 不帶 'c' 標誌位: "/..." 前進 1 個字符 帶 'c' 標誌位對應結果難以徹底肯定,由於查找能夠從第一列開始,忽略任何匹配,直 到找到超過光標位置的匹配爲止。 若是反向尋找,要是如上所述 'cpoptions' 裏包含了 'c' 標誌位的話,從行首開始搜 索,使用光標位置以前的最後一個匹配。 在 Vi 裏 ":tag" 命令會將最近查找模式設定爲要搜索的標籤。除非 'cpoptions' 選項 中包括 't' 標誌位,Vim 不會這樣作,前次查找模式仍然被記住。查找模式總被存入查 找歷史記錄。 若是 'wrapscan' 選項的值爲真 (缺省) 的話,查找會在緩衝區的結尾折返到首部。若是 不爲真,反向查找會在開始處中止;正向查找會在結尾處中止。若是該選項爲真但找不到 該模式,會給出一個錯誤信息: "pattern not found",光標原地不動。若是不爲真,取 決於查找的方向是正向仍是反向,給出的信息是: "search hit BOTTOM without match" 或者 "search hit TOP without match"。若是該選項爲真,當查找折返時會分別顯示: "search hit TOP, continuing at BOTTOM" 或 "search hit BOTTOM, continuing at TOP"。此時,消息能夠用設定 'shortmess' 選項裏的 's' 標誌位來關閉。該信息的顯示 會使用 'w' 的高亮方法 (缺省: 突出)。 search-range 用 \%>l 項目,你能夠限定 "/" 命令查找的範圍。例如,要在行 199 之下行 300 之上 搜索單詞 "limit": 另見 /\%>l 。 另外一個方法是使用 ":substitute" 命令並與 'c' 聯用。例: 這個命令會從光標所在處開始查找 "Pattern",直到第 300 行。在匹配處,你會被提示 鍵入一個字符。鍵入 'q' 終止;鍵入 'n' 找下一個匹配。 "*","#","g*" 和 "g#" 命令依照如下的次序查找在光標附近的一個單詞,使用如下最 先找到的那個: - 光標所在的關鍵字。 - 同行的光標右側的第一個關鍵字。 - 光標下的第一個字串 (WORD)。 - 同行的光標右側的第一個字串 (WORD)。 關鍵字只能包括字母和 'iskeyword' 中的字符。字串 (WORD) 能夠包括任何非空白 ( 和/或 )。 若是你用十個指頭打字的話,這些字符是很容易記住的: "#" 在你的左手中指上 (向左上查找);"*" 在你的右手中指上 (向右下查找)。 (不過,這取決於你的鍵盤佈局)。 {pattern}<CR>[count]{pattern}{pattern}{offset}<CR>[count]{pattern}<CR>[count]{offset}<CR>[count]{offset}{pattern}<CR>[count]{pattern}{pattern}{offset}<CR>[count]{pattern}<CR>[count]{offset}<CR>[count]{offset}[count]{Vi: 無計數}[count]{Vi: 無計數}[count]{Vi 無此功能}<BS><BS>CTRL-H{Vi 無此功能}{Vi 無此功能}{Vi 無此功能}注意{Vi 無此功能}{Vi 無此功能}{}{Vi 無此功能}{}{Vi 無此功能}CTRL-CCTRL-Break<CR><ESC>注意{Vi 沒有字符偏移}[num][num][num][num][num][num][+num][num][-num][num][+num][num][-num][num][+num][num][+num][-num][num][-num]{pattern}[num]模式 光標位置/foo<CR> 查找 "foo"c//e<CR> 修改從當前位置到匹配結尾的部分bar<Esc> 輸入替換文本//<CR> 跳轉到下一個相同匹配的開始c//e<CR> 修改從當前位置到匹配結尾的部分beep<Esc> 輸入替換文本等等。/test 1/;/test/test.*/+1;?ing?注意:let @/ = ""/\%>199l\%<300llimit:.,300s/Pattern//gc<Tab><Space>備註
regular-expression regexp Pattern E76 E383 E476 頭一道菜已經在用戶手冊的第 27 章 usr_27.txt 上過了。 /bar /\bar /pattern 1. 一個模式 (pattern) 是由 "\|" 分隔開的一個或多個分支 (branch)。它能夠匹配其 中的任何一個分支匹配的文本。例如: "foo\|beep" 能夠匹配 "foo" 或 "beep"。如 果超過一個分支能夠匹配,選用其中的第一個。 pattern ::= branch 或 branch \| branch 或 branch \| branch \| branch 等。 /branch /\& 2. 一個分支是一個或多個被 "\&" 分隔的鄰接。它匹配最後一個鄰接,但僅僅當前面所 的鄰接也在一樣位置匹配。例: "foobeep\&..." 匹配 "foobeep" 中的 "foo"。 ".*Peter\&.*Bob" 匹配同時包括 "Peter" 和 "Bob" 的一行 branch ::= concat 或 concat \& concat 或 concat \& concat \& concat 等。 /concat 3. 一個鄰接 (concat) 是一或多個相鄰的組件 (piece)。它匹配第一個組件,後接第二 個組件的匹配,等等。例如: "f[0-9]b",先匹配 "f",而後是一個數位,接着 "b"。 concat ::= piece 或 piece piece 或 piece piece piece 等。 /piece 4. 一個組件是一個匹配原 (atom),後面可能帶一個倍數 (multi),用來表示該匹配原匹 配的次數。例如: "a*" 匹配任意個 "a" 組成的序列: "","a","aa" 等。參見 /multi 。 piece ::= atom 或 atom multi /atom 5. 一個匹配原能夠是一個很長的條目列表中的一個。許多匹配原用來匹配文本中的一個 字符,一般是一個普通的字符或字符類。也能夠用圓括號來將一個模式變成一個匹配 原。下面的 "\z(\)" 構造僅用在語法高亮中。 atom ::= ordinary-atom /ordinary-atom 或 \( pattern \) /\( 或 \%( pattern \) /\%( 或 \z( pattern \) /\z( /\%#= two-engines NFA Vim 包含兩個正規表達式引擎: 1. 老式的基於回溯的引擎,支持全部功能。 2. 新式的 NFA 引擎,對某些模式會快不少,對某些模式可能會變慢。 Vim 會自動爲你選擇合適的引擎。不過,若是你遇過問題或者想特別指定某一個引擎,可 以在模式開頭處加入: \%#=0 強制自動選擇。僅在 'regexpengine' 設爲非零時纔有效果。 \%#=1 強制使用舊引擎。 \%#=2 強制使用 NFA 引擎。 也可用 'regexpengine' 選項改變缺省機制。 E864 E868 E874 E875 E876 E877 E878 選擇 NFA 引擎時若是遇到未實現的模式部分時,整個模式會不匹配。只用於調試 Vim。
某些字符在模式中是按本義出現的。它們匹配自身。然而,當前面有一個反斜槓時,這些 字符具備特殊的含義。 另一些字符即便沒有反斜槓也表明特殊的意思。它們反而須要一個反斜槓來匹配按本義 出現的自身。 一個字符是否按本義出現取決於 'magic' 選項以及下面將解釋的條目。 /\m /\M 使用 "\m" 會使得其後的模式的解釋方式就如同設定了 'magic' 選項同樣。並且將忽略 'magic' 選項的實際值。 使用 "\M" 會使得其後的模式的解釋方式就如同設定了 'nomagic' 選項同樣。 /\v /\V 使用 "\v" 會使得其後的模式中全部 '0'-'9','a'-'z','A'-'Z' 和 '_' 以外的字符都 看成特殊字符解釋。"very magic" 使用 "\V" 會使得其後的模式中只有反斜槓和終止字符 (/ 或 ?) 有特殊的意義。"very nomagic" 示例: 'magic' 'nomagic' $ $ $ \$ 匹配行尾 . . \. \. 匹配任何字符 * * \* \* 前面匹配原的任意次重複 ~ ~ \~ \~ 最近替代字符串 () \(\) \(\) \(\) 組成爲單個匹配原 | \| \| \| 分隔可選分支 \a \a \a \a 字母字符 \\ \\ \\ \\ 反斜槓 (按本義) \. \. . . 英文句號 (按本義) \{ { { { '{' (按本義) a a a a 'a' (按本義) 建議始終將 'magic' 選項保持在缺省值 - 'magic'。這能夠避免移植性的麻煩。要使 模式不受該選項值的影響,在模式前面加上 "\m" 或 "\M"。 在這以後: \v \m \M \V 匹配{僅 Vim 支持 \m,\M,\v 和 \V}
E865 E866 E867 E869 倍數總覽。 /multi E61 E62 更多解釋和示例見下,點擊連接便可。 E64 E871 /star * \* 0 或更多 儘量多 /\+ \+ \+ 1 或更多 儘量多 (*) /\= \= \= 0 或 1 儘量多 (*) /\? \? \? 0 或 1 儘量多 (*) /\{ \ \ n 到 m 儘量多 (*) \ \ n 準確 (*) \ \ 最少 n 儘量多 (*) \ \ 0 到 m 儘量多 (*) \ \ 0 或更多 儘量多 (和 * 相同) (*) /\{- \ \ n 到 m 儘量少 (*) \ \ n 準確 (*) \ \ 最少 n 儘量少 (*) \ \ 0 到 m 儘量少 (*) \ \ 0 或更多 儘量少 (*) E59 /\@> \@> \@> 1,要求完整的模式匹配 (不能回溯) (*) /\@= \@= \@= 無,但要求匹配 /zero-width (*) /\@! \@! \@! 無,但要求 匹配 /zero-width (*) /\@<= \@<= \@<= 無,但要求反向匹配 /zero-width (*) /\@<! \@<! \@<! 無,但要其反向 匹配 /zero-width (*) (*) 普通匹配原總覽。 /ordinary-atom 更多解釋和示例見下,點擊連接便可。 /^ ^ ^ 行首 (在模式起始) /zero-width /\^ \^ \^ 按本義出現的 '^' /\_^ \_^ \_^ 行首 (用於任何地方) /zero-width /$ $ $ 行尾 (在模式結尾) /zero-width /\$ \$ \$ 按本義出現的 '$' /\_$ \_$ \_$ 行尾 (用於任何地方) /zero-width /. . \. 任何單個字符 (不包括換行) /\_. \_. \_. 任何單個字符,包括換行 /\< \< \< 單詞的起始 /zero-width /\> \> \> 單詞的結尾 /zero-width /\zs \zs \zs 任何字符,設定匹配部分起始 /\ze \ze \ze 任何字符,設定匹配部分結束 /\%^ \%^ \%^ 文件首 /zero-width E71 /\%$ \%$ \%$ 文件尾 /zero-width /\%V \%V \%V 可視區域內 /zero-width /\%# \%# \%# 光標位置 /zero-width /\%'m \%'m \%'m 位置標記 m 的位置 /zero-width /\%l \%23l \%23l 在第 23 行 /zero-width /\%c \%23c \%23c 在第 23 列 /zero-width /\%v \%23v \%23v 在虛擬第 23 列 /zero-width 字符類 : /character-classes /\i \i \i 標識符字符 (見 'isident' 選項) /\I \I \I 同 "\i",但不包括數字字符 /\k \k \k 關鍵字字符 (見 'iskeyword' 選項) /\K \K \K 同 "\k",但不包括數字字符 /\f \f \f 文件名字符 (見 'isfname' 選項) /\F \F \F 同 "\f",但不包括數字字符 /\p \p \p 可顯示字符 (見 'isprint' 選項) /\P \P \P 同 "\p",但不包括數字字符 /\s \s \s 空白字符; 和 /\S \S \S 非空白字符: \s 之反 /\d \d \d 數位: [0-9] /\D \D \D 非數位: [^0-9] /\x \x \x 十六進制數位: [0-9A-Fa-f] /\X \X \X 非十六進制數位: [^0-9A-Fa-f] /\o \o \o 八進制數位: [0-7] /\O \O \O 非八進制數位: [^0-7] /\w \w \w 單詞字符: [0-9A-Za-z_] /\W \W \W 非單詞字符: [^0-9A-Za-z_] /\h \h \h 單詞首字符: [A-Za-z_] /\H \H \H 非單詞首字符: [^A-Za-z_] /\a \a \a 英文字母字符: [A-Za-z] /\A \A \A 非英文字母字符: [^A-Za-z] /\l \l \l 小寫字符: [a-z] /\L \L \L 非小寫字符: [^a-z] /\u \u \u 大寫字符: [A-Z] /\U \U \U 非大寫字符 [^A-Z] /\_ \_x \_x 其中 x 能夠是以上任意一個字符: 對應字符類加上換行 (字符類結束) /\e \e \e /\t \t \t /\r \r \r /\b \b \b /\n \n \n 行尾符 /~ ~ \~ 上次給出的替代字符串 /\1 \1 \1 第一個 \(\) 匹配的字符 /\2 \2 \2 如 "\1",但用第二個 \(\) ... /\9 \9 \9 如 "\1",但用第九個 \(\) E68 /\z1 \z1 \z1 僅用於語法高亮,見 :syn-ext-match ... /\z1 \z9 \z9 僅用於語法高亮,見 :syn-ext-match x x 一個沒有特殊含義的字符匹配其自身 /[] [] \[] [] 內指定的任何字符之一 /\%[] \%[] \%[] 一個可選匹配原的序列 /\c \c \c 忽略大小寫,不使用 'ignorecase' 選項 /\C \C \C 匹配大小寫,不使用 'ignorecase' 選項 /\Z \Z \Z 忽略 Unicode 中的 "組合用字符" 的區別,對於搜索帶元音 的希伯來和阿拉伯文本有用。 /\m \m \m 對以後模式中字符打開 'magic' 選項 /\M \M \M 對以後模式中字符關閉 'magic' 選項 /\v \v \v 對以後模式中字符設定 'magic' 選項爲 "very magic" /\V \V \V 對以後模式中字符設定 'magic' 選項爲 "very nomagic" /\%#= \%#=1 \%#=1 選擇正規表達式引擎 /zero-width /\%d \%d \%d 匹配用十進制指定的字符 (如 \%d123) /\%x \%x \%x 匹配用十六進制指定的字符 (如 \%x2a) /\%o \%o \%o 匹配用八進制指定的字符 (如 \%o040) /\%u \%u \%u 匹配指定的多字節字符 (如 \%u20ac) /\%U \%U \%U 匹配指定的巨大多字節字符 (如 \%U12345678) /\%C \%C \%C 匹配任何合成用字符 \<\I\i* 或 \<\h\w* \<[a-zA-Z_][a-zA-Z0-9_]* 一個標識符 (例如,在一個 C 程序裏)。 \(\.$\|\. \) 一個英文句號後跟 或一個空格。 [.!?][])"']*\($\|[ ]\) 一個匹配英文句子結尾的模式。幾乎和 ")" 的定義相同。 cat\Z 匹配 "cat" 和 "càt" ("a" 後跟 0x0300) 不匹配 "càt" (字符 0x00e0),即便它們看起來可能同樣。 倍數'magic' 'nomagic' 匹配前面的匹配原{n,m}{n,m}{n}{n}{n,}{n,}{,m}{,m}{}{}{-n,m}{-n,m}{-n}{-n}{-n,}{-n,}{-,m}{-,m}{-}{-}不不{Vi 無此功能}普通匹配原magic nomagic 匹配{Vi 無此功能}magic nomagic 匹配<Space><Tab>magic nomagic 匹配<Esc><Tab><CR><BS>{Vi 無此功能}magic nomagic 匹配示例 匹配<EOL>
一個匹配原後面能夠跟一個表示該匹配原匹配次數和方式的修飾。這個修飾稱爲倍數。 在 /multi 能夠看到一個綜述。 /star /\star * (在沒有設定 'magic' 時使用 \*) 匹配 0 或更多個前面的匹配原,儘量多地匹配。 a* a\* ""、"a"、"aa"、"aaa" 等。 .* \.\* 任意,包括空串,不包括行尾符 \_.* \_.\* 匹配至緩衝區結束 \_.*END \_.\*END 匹配至緩衝區中最後一次出現 "END" 處,包括該 "END" 特例: 當 "*" 用在模式的開頭或者緊跟在 "^" 以後時,它匹配星號字符。 要小心,重複匹配 "\_." 會包括大量的文本,於是可能會花很長時間。例如, "\_.*END" 匹配從當前位置開始到文件中最後一次出現 "END" 的地方。由於 "*" 會盡量多的匹配,它會先跳過到文件結束前的全部行,而後一次退一個字 符以查找 "END"。 /\+ \+ 匹配一個或更多前面的匹配原。儘量多。 ^.\+$ 任意空行 \s\+ 一個以上的空白字符 /\= \= 匹配 0 或 1 個前面的匹配原。儘量多。 foo\= "fo" 和 "foo" /\? \? 和 \= 同樣。不能和反向查找的 "?" 命令中使用。 /\{ E60 E554 E870 \ 匹配 n 至 m 個前面的匹配原。儘量多 \ 匹配 n 個前面的匹配原 \ 匹配至少 n 個前面的匹配原。儘量多 \ 匹配 0 至 m 個前面的匹配原。儘量多 \ 匹配 0 個以上前面的匹配原。儘量多 (和 * 等價) /\{- \ 匹配 n 至 m 個前面的匹配原。儘量少 \ 匹配 n 個前面的匹配原 \ 匹配至少 n 個前面的匹配原。儘量少 \ 匹配 0 至 m 個前面的匹配原。儘量少 \ 匹配 0 個以上前面的匹配原。儘量少 n 和 m 是正的十進制數或零 non-greedy 若是一個 "-" 緊接在 "{" 以後,那麼最短匹配優先算法將啓用 (見下面的例 子)。特別的,"\" 和 "*" 同樣,但使用最短匹配優先算法。 ,更早 開始的匹配比更短的匹配優先: "a\b" 匹配 "xaaab" 中的 "aaab"。 ab\c "abbc" 或 "abbbc" a\ "aaaaa" ab\c "abbc"、"abbbc"、"abbbbc" 等 ab\c "ac"、"abc"、"abbc" 或 "abbbc" a[bc]\d "abbbd"、"abbcd"、"acbcd"、"acccd" 等。 a\(bc\)\d "abcd" 或 "abcbcd" a[bc]\[cd] "abcd" 中的 "abc" a[bc]*[cd] "abcd" 中的 "abcd" } 以前能夠加 (也能夠不加) 一個反斜槓: \。 /\@= \@= 零寬度匹配前面的匹配原。 相似於 Perl 中的 "(?=pattern)"。 foo\(bar\)\@= "foobar" 中的 "foo" foo\(bar\)\@=foo 空 /zero-width "\@=" (或 "^","$","\<","\>") 的匹配不包括任何字符。這些字符僅僅是用 來檢查匹配是否存在。這很容易搞錯,由於後續的項會在一樣位置做匹配。上面 的最後一個例子不會匹配 "foobarfoo",由於 Vim 會嘗試在 "bar" 匹配的一樣 地方匹配 "foo"。 使用 "\&" 同使用 "\@=" 是同樣的: "foo\&.." 等於 "\(foo\)\@=.."。 但用 "\&" 容易些,你能夠省了那些括號。 /\@! \@! 零寬度否匹配,亦即,要求前面的匹配原在當前位置 匹配。 /zero-width 相似於 Perl 中的 "(?!pattern)"。 foo\(bar\)\@! 任意後面不帶 "bar" 的 "foo" a.\p\@! "a","ap","app","appp" 等。後面不帶 "p" if \(\(then\)\@!.\)*$ "if " 後面無跟隨 "then" 使用 "\@!" 要當心,由於不少地方一個模式能夠不匹配。"a.*p\@!" 會匹配一 個 "a" 直到行尾,由於 ".*" 匹配全部行內的字符,而 "p" 不在行尾匹配。 "a.\p\@!" 則能夠匹配 "a","ap","app" 等中的一項,只要它們再也不緊跟 另一個 "p",這是由於 "." 能夠匹配 "p" 而 "p\@!" 不匹配這個 "p" 的後 面。 你不能用 "\@!" 去尋找匹配所在位置以前的否匹配。"\(foo\)\@!bar" 會匹配 "foobar" 中的 "bar",由於在 "bar" 匹配的位置上,"foo" 並不匹配。若是 不想匹配 "foobar",你能夠嘗試 "\(foo\)\@!...bar",但它不能匹配在行首出 現的 "bar"。最好的方法是用 "\(foo\)\@<!bar"。 有用的例子: 要找到包含 "foo" 但沒有 "bar" 的行: 此模式先檢查某行中沒有一個位置能夠匹配 "bar"。若是 ".*bar" 匹配,\@! 會拒絕本模式。不然,繼續尋找 "foo"。"\zs" 使得匹配從 "foo" 處開始。 /\@<= \@<= 零寬度反向匹配。要求前面的匹配原緊貼在後面的模式以前匹配。 /zero-width 相似於 Perl 的 "(?<=pattern)",可是 Vim 容許使用非固定寬度的模式。 \(an\_s\+\)\@<=file 在 "an" 和若干個空白或者行尾符以後的 "file"。 爲了提升性能,最好避免這個倍數項。能夠用 "\zs" 替代 /\zs 。要匹配 上述的示例: an\_s\+\zsfile 反向匹配時至少要設一個限制範圍,見下。 "\@<=" 和 "\@<!" 檢查恰好在其後模式匹配點以前出現的匹配文本。理論上, 這些匹配能夠從當前位置以前的任何地方開始,爲了限制所需的時間,只有其後 匹配所在的行和它上一行 (若是有上一行的話) 會被檢索。這對大多數的應用來 說已經足夠,並且也不會減慢速度太多。 在舊的正規表達式引擎裏,在 "\@<=" 和 "\@<!" 以後的模式部分其實先被匹 配,因此不能用 "\1" 之類的結構來引用零寬度匹配原中的 \(\)。反過來卻是 能夠的。 \%#=1\1\@<=,\([a-z]\+\) "abc,abc" 裏的 ",abc" 不過,新的正規表達式引擎工做方式不一樣,最好不要依賴此行爲,若是能夠避 免,不要用 \@<=: \([a-z]\+\)\zs,\1 "abc,abc" 裏的 ",abc" \@123<= 相似於 "\@<=",但只往回看 123 個字節。這樣能夠避免去匹配不少已知不會成 功的但使模式很慢的嘗試。例如,要檢查緊接 "span" 以前要否有 "<": /<\@1<=span 這裏只須對 "span" 以前一個字節試圖匹配 "<",原本這也是惟一可能的位置。 若是跨過行邊界,此限制相對於該行的行尾。這樣,匹配所在行的行首部分不計 入限制範圍 (只是爲了簡單起見)。 零至關於無限制。 /\@<! \@<! 零寬度反向否匹配,要求前面的匹配原 緊貼在其後的模式以前匹配。換而言 之,若是在當前行或以前的一行中沒有任何位置這個匹配原能夠匹配並且它的匹 配文本恰好緊貼在其後模式的匹配點以前。 /zero-width 相似於 Perl 的 "(?<!pattern)",可是 Vim 容許使用非固定寬度的模式。 該倍數所引用的匹配原必須緊貼在其後匹配以前,因此這個匹配原能夠用 ".*" 結尾。警告: 該倍數項可能會很慢 (由於在匹配以前的許多位置都要被檢查)。 若有可能,請使用限制範圍,見下。 \(foo\)\@<!bar 任何不在 "foobar" 中的 "bar" \(\/\/.*\)\@<!in 不在 "//" 以後 (中間能夠有間隔) 的 "in" \@123<! 相似於 "\@<!",但只往回看 123 個字節。這樣能夠避免去匹配不少已知不會成 功的但使模式很慢的嘗試。 /\@> \@> 匹配前面的匹配原時要求完整匹配 (不能回溯)。 相似於 Perl 中的 "(?>pattern)"。 \(a*\)\@>a 無 ("a*" 用盡了全部的 "a",後面不可能再有) 試圖匹配前面的匹配原,就如同匹配一個完整的模式那樣。若是之後沒法匹配, 不會用較短的子模式或者任何其它的方法來重試該匹配原。觀察如下二者的 不一樣: "a*b" 和 "a*ab" 都匹配 "aaab",可是後者中的 "a*" 僅僅匹配前兩個 "a"。"\(a*\)\@>ab" 不會匹配 "aaab",由於 "a*" 匹配了 "aaa" (儘量多 的 "a"),致使 "ab" 沒法匹配。 示例 'nomagic' 匹配{Vi 無此功能}例 匹配{Vi 無此功能}例 匹配{Vi 無此功能}{n,m}{n}{n,}{,m}{}{-n,m}{-n}{-n,}{-,m}{-}{Vi 沒有這些}{-}不過{-}示例 匹配{2,3}{5}{2,}{,3}{3}{1,2}{-}{n,m\}{Vi 無此功能}示例 匹配注意不{Vi 無此功能}示例 匹配{-}{-}/^\%(.*bar\)\@!.*\zsfoo{Vi 無此功能}示例 匹配壞示例 匹配示例 匹配不{Vi 無此功能}示例 匹配{Vi 無此功能}示例 匹配注意
一個普通匹配原多是: /^ ^ 在模式起點或在 "\|","\(","\%(","\n" 以後: 匹配行首;在其它位置匹配 按本義出現的 '^' 字符。 /zero-width ^beep( C 函數 "beep" 開始的地方 (極可能)。 /\^ \^ 匹配按本義出現的 '^' 字符。能夠用於任何位置。 /\_^ \_^ 匹配行首。 /zero-width 能夠用於任何位置。 \_s*\_^foo 空白字符及空行,後接行首的 "foo"。 /$ $ 在模式終點或 "\|"、"\)" 或 "\n" (打開 'magic' 的話) 以前: 匹配行尾 ;其它位置,匹配按本義出現的 '$' 字符。 /zero-width /\$ \$ 匹配按本義出現的 '$' 字符。能夠用於任何位置。 /\_$ \_$ 匹配行尾。 /zero-width 能夠用於任何位置。: "a\_$b" 永遠沒法匹 配,由於 "b" 不能匹配行尾符。可使用 "a\nb" 代替 /\n 。 foo\_$\_s* "foo" 在行尾,後接空白字符及空行 . ('nomagic' 的情形: \.) /. /\. 匹配任何單個字符,不包括行尾符。 /\_. \_. 匹配任何單個字符或行尾符。小心: "\_.*" 會一直匹配到緩衝區結尾! /\< \< 匹配單詞起點: 下一個字符是單詞的首字符。'iskeyword' 選項指定哪些是組成 單詞的字符。 /zero-width /\> \> 匹配單詞終點: 前一個字符是單詞的尾字符。'iskeyword' 選項指定哪些是組成 單詞的字符。 /zero-width /\zs \zs 匹配任何位置,並將匹配起始處置於該處: 下一個字符將是整個匹配的第一個字 符。 /zero-width 例如: 匹配行首的 "if",忽略前導的空白字符。 可使用屢次,但實際使用最後一次在匹配的分支裏遇到的。例如: 找到第三次出現的 "Fab"。 不能後跟倍數。 E888 /\ze \ze 匹配任何位置,並將匹配結尾處置於該處: 前一個字符將是整個匹配的最後一個 字符。 /zero-width 可使用屢次,但實際使用最後一次在匹配的分支裏遇到的。 例如: "end\ze\(if\|for\)" 匹配 "endif" 和 "endfor" 中的 "end"。 不能後跟倍數。 E888 /\%^ start-of-file \%^ 匹配文件頭。當用於一個字符串時,匹配字符串起始處。 例如,要查找一個文件中首次出現 "VIM" 的地方: /\%$ end-of-file \%$ 匹配文件尾。當用於一個字符串時,匹配字符串結束處。 下面的模式不匹配文件中的最後一個 "VIM": 它會找到下一個 VIM,由於其後的部分總會匹配。這樣才能匹配文件中的最後一 個 "VIM": 這裏使用了 /\@! 來肯定在首個 "VIM" 以後 再次匹配 "VIM"。 從文件尾部反向搜索會容易些! /\%V \%V 在可視區域內匹配。可視模式中止後,在 gv 將會從新選擇的區域內匹配。 這是一個零寬度 /zero-width 匹配。要確保整個模式都在可視區域裏,把本 匹配原放在匹配模式的開始和恰好結尾以前處,例如: 這在可視選擇只包含 "foo bar" 時,纔會匹配。而: 這在可視選擇區在 "r" 以後繼續時,纔會匹配 "foo bar"。 只能用於當前緩衝區。 /\%# cursor-position \%# 匹配光標位置。僅對顯示於窗口內的緩衝區有效。 警 告: 若是使用了該模式以後光標被移動,結果再也不有效,Vim 不會自動更新 匹配。這對語法高亮和 'hlsearch' 很重要。換言之: 在光標移動時顯示並不因 此而更新。Vim 只對行被修改 (整行被更新) 或用戶使用 CTRL-L 命令時 (整 個屏幕被更新) 進行更新。例如,要高亮顯示光標下的單詞: 當設定 'hlsearch' 時,移動光標並做若干更改,你就能清楚地看到更新在什麼時候 進行。 /\%'m /\%<'m /\%>'m \%'m 匹配位置標記 m 的位置。 \%<'m 匹配位置標記 m 以前的位置。 \%>'m 匹配位置標記 m 以後的位置。 例如,高亮位置標記 's 到 'e 的文本: 在匹配裏須要兩個句號來包含位置標記 'e。這是由於 "\%<'e" 匹配 'e 位置標記以前的字符,而既然它是零寬度匹配 /zero-width ,它並不真正包含 該字符。 警 告: 若是使用模式後移動了位置標記,結果再也不有效。Vim 並不自動更新匹 配。這和 "\%#" 裏移動光標的情形相似 /\%# 。 /\%l /\%>l /\%<l \%23l 匹配指定的行。 \%<23l 匹配指定行的上方 (行號更小)。 \%>23l 匹配指定行的下方 (行號更大)。 這三個匹配原能夠用來匹配緩衝區內的特定行。"23" 能夠是任何行號。第一行 爲 1。 警 告: 當插入和刪除行時 Vim 不會自動更新匹配。這意味着語法高亮很快就會 有問題。 例如,要高亮顯示光標所在行: 當設定 'hlsearch' 時,移動光標並做若干更改,你就能清楚地看到更新在什麼時候 進行。 /\%c /\%>c /\%<c \%23c 匹配指定的列。 \%<23c 匹配指定列以前。 \%>23c 匹配指定列以後。 這三個匹配原能夠用來匹配緩衝區或字符串中的特定列。"23" 能夠是任何列 號。第一列爲 1。事實上,列以字節計算 (所以對多字節字符來講是不許確 的)。 警 告: 當插入和刪除字符時 Vim 並不自動更新匹配。這意味着語法高亮很快就 會有問題。 例如,要高亮顯示光標所在列: 當設定 'hlsearch' 時,移動光標並做若干更改,你就能清楚地看到更新在什麼時候 進行。 一個匹配第 44 列單個字節的例子: : "\%<46c" 匹配第 45 列,而 "." 匹配 44 列的一個字節。 /\%v /\%>v /\%<v \%23v 匹配指定虛擬列。 \%<23v 匹配指定虛擬列以前。 \%>23v 匹配指定虛擬列以後。 這三個匹配原能夠用來匹配緩衝區或字符串中指定的虛擬列。若是不是在匹配窗 口內的緩衝區,使用當前窗口的選項值 (如 'tabstop')。 "23" 能夠是任何列號。第一列爲 1。 某些虛擬列位置永遠沒法被匹配,由於它們在製表符或其它佔用超過一個 屏幕位置的特殊字符的中間某處。 警 告: 當插入和刪除字符時 Vim 並不自動更新高亮的匹配。這意味着語法高亮 很快就會有問題。 例如,要高亮顯示全部位於虛擬第 72 列以後的字符: 當設定 'hlsearch' 時,移動光標並做若干更改,你就能清楚地看到更新在什麼時候 進行。 要匹配直到第 17 列的文本: 這裏不包括第 17 列,由於這是 /zero-width 匹配。要包含該列,應用: 下例同上,但若是第 17 列沒有字符也一樣匹配: 若是沒有 "^" 來錨住首列的匹配,第 17 列也能被高亮: 'hlsearch' 高亮第 17 列,由於存在另一個匹配,其中 ".*" 匹配零個字 符。 字符類: \i 標識符字符 (見 'isident' 選項) /\i \I 同 "\i",但不包括數字字符 /\I \k 關鍵字字符 (見 'iskeyword' 選項) /\k \K 同 "\k",但不包括數字字符 /\K \f 文件名字符 (見 'isfname' 選項) /\f \F 同 "\f",但不包括數字字符 /\F \p 可顯示字符 (見 'isprint' 選項) /\p \P 同 "\p",但不包括數字字符 /\P : 上面這些適用於多字節字符,而下面只匹配 ASCII 字符,由於它們由範圍限定。 whitespace white-space \s 空白字符; 和 /\s \S 非空白字符: \s 之反 /\S \d 數位: [0-9] /\d \D 非數位: [^0-9] /\D \x 十六進制數位: [0-9A-Fa-f] /\x \X 非十六進制數位: [^0-9A-Fa-f] /\X \o 八進制數位: [0-7] /\o \O 非八進制數位: [^0-7] /\O \w 單詞字符: [0-9A-Za-z_] /\w \W 非單詞字符: [^0-9A-Za-z_] /\W \h 單詞首字符: [A-Za-z_] /\h \H 非單詞首字符: [^A-Za-z_] /\H \a 英文字母字符: [A-Za-z] /\a \A 非英文字母字符: [^A-Za-z] /\A \l 小寫字符: [a-z] /\l \L 非小寫字符: [^a-z] /\L \u 大寫字符: [A-Z] /\u \U 非大寫字符: [^A-Z] /\U : 使用匹配原比使用 [] 構造要快。 : 字符類不使用 'ignorecase',"\c" 和 "\C" 的設定。 /\_ E63 /\_i /\_I /\_k /\_K /\_f /\_F /\_p /\_P /\_s /\_S /\_d /\_D /\_x /\_X /\_o /\_O /\_w /\_W /\_h /\_H /\_a /\_A /\_l /\_L /\_u /\_U \_x 其中 x 爲上面列出的可用字符之一: 結果爲對應字符類加上行尾符 (字符類結束) \e 匹配 /\e \t 匹配 /\t \r 匹配 /\r \b 匹配 /\b \n 匹配行尾符 /\n 當對字符串而不是緩衝區進行匹配時,匹配一個按本義出現的換行字符。 ~ 匹配上次給出的替代字符串 /~ /\~ \(\) 一個由轉義的括號括起來的模式。 /\( /\(\) /\) 例: "\(^a\)" 匹配行首的 'a'。 E51 E54 E55 E872 E873 \1 匹配和第一個 \( 和 \) 之間的子表達式的匹配文本 /\1 E65 相同的字符串。 例如: "\([a-z]\).\1" 匹配 "ata","ehe","tot" 等。 \2 相似於 "\1",但使用第二子表達式, /\2 ... /\3 \9 相似於 "\1",但使用第三子表達式。 /\9 : 各組的標號是基於哪個 "\(" 先出現 (自左至右),而 哪個先匹 配。 \%(\) 一個由轉義的括號括起來的模式。 /\%(\) /\%( E53 相似 \(\),但不算做一個子表達式。這樣作容許使用更多的羣組,而且處理時 會稍快些。 x 一個沒有特殊含義的單個字符,匹配其自身 /\ /\\ \x 一個反斜槓帶一個沒有特殊含義的單個字符,保留做未來的擴展 [] ('nomagic' 的情形: \[]) /[] /\[] /\_[] /collection \_[] 一個集合。一組由方括號括起來的字符。匹配集合中的任何一個字符。 'x'、'y' 或 'z' 之一 [a-zA-Z]$ 出如今行尾的字母字符 \c[a-z]$ 同上 [Ð-ÑÐÑ] 俄語字符集 (包括 utf-8 和 cp1251) /[\n] 若是在集合前加上 "\_" 的話,同時匹配行尾符,這等價於給集合加上 "\n"。 即便該模式以 "^" 開始,也能匹配行尾符!所以 "\_[^ab]" 將匹配行尾符以及 全部非 "a" 或 "b" 的字符。 這使其與 Vi 兼容: 沒有 "\_" 或 "\n" 時,集合不匹配行尾符。 E769 若是沒有 ']',Vim 不會給出錯誤信息,而是假設不使用集合。可用於直接搜索 '['。不過內部搜索會獲得 E769。同時要在 ":substitute" 命令裏,整個 命令做爲模式處理,例如 ":s/[/x/" 搜索 "[/x" 並替換爲空,而不是搜索 "[" 並替換爲 "x"! E944 E945 若是集合以 "^" 開始,它匹配全部 集合內的字符: "[^xyz]" 匹配任何不 是 'x'、'y' 和 'z' 的字符。 - 若是集合中的兩個字符以 '-' 隔開,表示它們之間的全部 ASCII 字符。例 如,"[0-9]" 匹配任何十進制數位。若是開始字符大於結束字符,如 [c-a], 報錯 E944。可使用非 ASCII 字符,但在舊的正規表達式引擎中字符值的距 離不能超過 256。例如設置 re=1 後搜索 [\u3000-\u4000],會報錯 E945。 在模式以前加上 \%#=2 能夠解決這個問題。 - 字符類表達式被解釋爲該字符類表明的字符集合。支持如下字符類: [:alnum:] [:alnum:] isalnum 字母和數位 [:alpha:] [:alpha:] isalpha 字母 [:blank:] [:blank:] 空格和製表 [:cntrl:] [:cntrl:] iscntrl 控制字符 [:digit:] [:digit:] 十進制數位 '0' 到 '9' [:graph:] [:graph:] isgraph ASCII 可顯示字符,不包括空格 [:lower:] [:lower:] (1) 小寫字母 (使用 'ignorecase' 時表明全部 字母) [:print:] [:print:] (2) 可顯示字符,包括空格 [:punct:] [:punct:] ispunct ASCII 標點字符 [:space:] [:space:] 空白字符: 空格、製表、CR、NL、垂直制 表、換頁 [:upper:] [:upper:] (3) 大寫字母 (使用 'ignorecase' 時表明全部 字母) [:xdigit:] [:xdigit:] 十六進制數位: 0-九、a-f、A-F [:return:] [:return:] 字符 [:tab:] [:tab:] 字符 [:escape:] [:escape:] 字符 [:backspace:] [:backspace:] 字符 方括號括起的字符類表達式是對於方括號定界的集合的擴充。例如,下面的模 式是一個 UNIX 文件名: "[-./[:alnum:]_~]\+"。即至少有一個字符的字符列 表,其中字符能夠是 '-','.','/',字母,數位,'_' 或 '~' 中的一個。 這些項僅對 8 位字符有效,但在新的正規表達式引擎裏, [:lower:] 和 [:upper:] 也可用於多字節字符。見 two-engines 。未來,其它項目可能也 可用於多字節字符。如今,要獲得全部的 "alpha" 字符,可用: [[:lower:][:upper:]]。 "函數" 列顯示使用的庫函數。具體實現取決於系統。不然: (1) 編譯時帶 +multi_byte 特性時,ASCII 使用 islower(),其它字符使 用 Vim 內建規則。 (2) 使用 Vim 內建規則 (3) 用 (1) 但使用 isupper() /[[= [==] - 等價類 (equivalence class)。匹配的字符和被比較的字符 "幾乎" 相同,但 重音的區別能夠忽略。目前支持 Unicode、latin1 和 latin9。形式是: [=a=] /[[. [..] - 排序規則元素 (collation element)。目前只能簡單地接受以下形式的單個字 符: [.a.] /\] - 要在集合以內包括字符 ']',^','-' 或 '\',只需在該字符前加上反斜槓 "[xyz\]]","[\^xyz]","[xy\-z]" 和 "[xyz\\]"。 (: POSIX 不支持這種反斜槓的用法)。 對於 ']' 你也能夠將其做爲第一個字符 (但可能在 "^" 以後) 而無須轉義: "[]xyz]" 或 "[^]xyz]" 。 對於 '-' 你也能夠將其做爲第一個或最後一個字符: "[-xyz]","[^-xyz]" 或 "[xyz-]"。 對於 '\' 你也能夠將其放置在除了 "^]-\bdertnoUux" 之外的任何一個字符 以前而無須轉義: "[\xyz]" 匹配 '\','x','y' 及 'z'。可是用 "\\" 好 些,由於未來的擴展可能會在 '\' 以後使用其它字符。 - 省略結尾的 ] 不被視爲錯誤。"[]" 等同於 "[]]",匹配 ']' 字符。 - 當 'cpoptions' 中不包括 'l' 標誌位時,如下轉義可用 : \e \t \r ( 行尾符!) \b \n 換行符,見上 /[\n] \d123 字符的十進制表示 \o40 字符的八進制表示,最大值爲 0377 \x20 字符的十六進制表示,最大值爲 0xff \u20AC 多字節字符的十六進制表示,最大值爲 0xffff \U1234 多字節字符的十六進制表示,最大值爲 0xffffffff : 其它曾在前面提到的反斜槓轉義碼 (: 如 \s、\d 等) 在方括號 [] 以內是不起做用的! - 用集合來匹配可能會很慢。由於每一個字符都要和集合中的每個字符做比較。 儘量使用上面提到的其它匹配原。例如: 一樣是匹配一個數位,"\d" 要比 "[0-9]" 快的多。 /\%[] E69 E70 E369 \%[] 一個可選匹配原的序列。它總能匹配,但試圖匹配儘可能多的列出的匹配原,而在 第一個不匹配的地方終止。例如: 匹配 "r","re","rea" 或者 "read"。採用最長可能的匹配。下面例子能夠用 來匹配 Ex 命令 "function",其中 "fu" 是必須的而 "nction" 是可選的: 這裏用到了單詞結尾匹配原 "\>" 來避免匹配 "full" 中的 "fu"。 當要匹配的不是普通字符時,問題就變得更復雜了。你不必定會常常這樣,但可 以這麼作。例如: 匹配 "r","re","ro","rea","roa","read" 及 "road"。 [] 裏不能有 \(\)、\%(\) 或 \z(\) 項,\%[] 也不能嵌套。 要包含 "[",用 "[[]" 而 "]" 則可用 "[]]",例如: 匹配 "index"、"index["、"index[0" 和 "index[0]"。 /\%d /\%x /\%o /\%u /\%U E678 \%d123 匹配十進制指定的字符。後面必須跟着非數位。 \%o40 匹配八進制指定的字符,至多 0377。 小於 040 的數必須後面跟着非八進制的數位或非數位。 \%x2a 匹配不超過兩位十六進制數位指定的字符。 \%u20AC 匹配不超過四位十六進制數位指定的字符。 \%U1234abcd 匹配不超過八位十六進制數位指定的字符。 示例 匹配示例 匹配<EOL>注意示例 匹配"^\s*\zsif"/\(.\{-}\zsFab\)\{3}{Vi 無此功能}{僅當編譯時加入 +syntax 特性纔可用}{Vi 無此功能}{僅當編譯時加入 +syntax 特性纔可用}{Vi 無此功能}/\%^\_.\{-}\zsVIM{Vi 無此功能}注意/VIM\_.\{-}\%$/VIM\ze\(\(VIM\)\@!\_.\)*\%$沒法/\%Vfoo.*ba\%Vr/\%Vfoo.*bar\%V{Vi 無此功能}/\k*\%#\k*/.\%>'s.*\%<'e..注意{Vi 無此功能}{Vi 無此功能}:exe '/\%' . line(".") . 'l.*'{Vi 無此功能}:exe '/\%' . col(".") . 'c'/\%>43c.\%<46c注意注意{Vi 無此功能}/\%>72v.*/^.*\%17v/^.*\%17v./^.*\%<18v.注意/.*\%17v{Vi 無此功能}備註<Space><Tab>備註備註<Esc><Tab><CR><BS>{Vi 無此功能}備註非{Vi 無此功能}示例 匹配[xyz]注意不在名稱 函數 內容<CR><Tab><Esc><BS>備註{Vi 無此功能}{Vi 無此功能}<Esc><Tab><CR>不是<BS>備註譯者注/r\%[ead]/\<fu\%[nction]\>/\<r\%[[eo]ad]\>/index\%[[[]0[]]]{僅當編譯時加入 +syntax 特性纔有效}
若是選項 'ignorecase' 打開的話,忽略正常字母的大小寫。設定 'smartcase' 會在模
式只包含小寫字母時才忽略大小寫。
/\c /\C
若是模式的任何位置出現了 "\c",整個模式會像打開 'ignorecase' 同樣處理。真正的
'ignorecase' 和 'smartcase' 的值會被忽略。"\C" 的效果剛好相反: 強制對整個模式
匹配大小寫。
'ignorecase',"\c" 和 "\C" 對字符類無效。
例如:
foo 關 - foo
foo 開 - foo Foo FOO
Foo 開 關 foo Foo FOO
Foo 開 開 Foo
\cfoo - - foo Foo FOO
foo\C - - foo
技術細節: NL-used-for-Nul
文件中的 字符在內存中存儲爲 。顯示爲 "^@"。翻譯是在讀寫文件時完成
的。爲了在查找模式中匹配 你可使用 或 " 000"。這應該不出你
的所料。在內部,該字符被替換爲 。不尋常的是鍵入 一樣插入一個
,所以也搜索文件中的 。
CR-used-for-NL
當 'fileformat' 爲 "mac" 時, 字符在內部儲存爲 。在文本里顯示爲 "^J"。
除此之外,和 做爲 的用法相似。
在做表達式求值時,模式中的 字符匹配字符串中的 。用 "\n" (反斜槓 n) 來
匹配 在這裏是行不通的,它僅對緩衝區內的文本有效。
pattern-multi-byte
模式匹配對於多字節字符一樣適用。大致上使用並沒有區別,不過要無效字節可能引發
的問題,一個包含無效字節的模式永遠不會獲得匹配。
{僅 Vim 支持 \c 和 \C}注意模式 'ignorecase' 'smartcase' 匹配<Nul><NL><Nul>CTRL-@CTRL-V<NL>CTRL-VCTRL-J<NL><Nul>{Vi 則徹底不能處理文件中的 <Nul>
字符}<Nul><NL><CR><NL><Nul><NL><NL><NL>注意
/\Z 若是模式的任何位置出現了 "\Z",全部的合成用字符將被忽略。這時,只比較基本字 符,合成用字符能夠不一樣,其數量也能夠不一樣。這一功能只在 'encoding' 爲 'utf-8' 時有意義。 例外: 若是模式以一或多個合成用字符開始,它們必須匹配。 /\%C "\%C" 可用來跳過任何合成用字符。例如,模式 "a" 不匹配 "càt" (這裏 a 有合成用字 符 0x0300),但 "a\%C" 能夠。 不匹配 "cát" (這裏 á 是字符 0xe1,沒有合成用 字符)。但匹配 "cat" (這裏 a 就是簡單的 a)。 若是一個合成用字符出如今模式的開始處或在不包含合成用字符的項目以後出現,它匹配 任何包含該合成用字符的字符。 句號和合成用字符聯用和合成用字符自己的效果相同,可是你不用擔憂該字符前面出現的 是什麼項目。 合成用字符出現的順序無關重要。另外,文本可使用比模式更多的合成用字符,它仍然 匹配。但模式中合成用字符必須全數出如今文本中。 假定 B 是基本字符,x 和 y 是合成用字符: Bxy Bxy 是 (徹底匹配) Bxy Byx 是 (忽略順序) Bxy By 否 (缺失 x) Bxy Bx 否 (缺失 y) Bx Bx 是 (徹底匹配) Bx By 否 (缺失 x) Bx Bxy 是 (忽略多餘的 y) Bx Byx 是 (忽略多餘的 y) 注意模式 文本 匹配與否
Vim 中的正則表達式和 Perl 的在功能上來講很是類似。它們之間的區別基本上只是在表 示方法上。這裏給出一個它們之間的區別的總結: 功能 Vim 方言 Perl 方言
強制不區分大小寫 \c (?i) 強制區分大小寫 \C (?-i) 不須被引用的羣組 \%(atom\) (?:atom) 保守的倍數描述 \ *?,+?,??,? 零寬度匹配 atom\@= (?=atom) 零寬度否匹配 atom\@! (?!atom) 零寬度反向匹配 atom\@<= (?<=atom) 零寬度反向否匹配 atom\@<! (?<!atom) 無重試匹配 atom\@> (?>atom) (譯註: 常見的其它譯法 不須被引用的羣組 非捕獲分組 保守的倍數描述 非貪婪匹配 零寬度匹配 正向預搜索匹配 零寬度否匹配 正向預搜索不匹配 零寬度反向匹配 反向預搜索匹配 零寬度反向否匹配 反向預搜索不匹配 ) Vim 和 Perl 匹配一個字符串中的換行符時有所不一樣: 在 Perl 裏,^ 和 $ 缺省只匹配文本的開始和結尾。可是你也能夠設定 'm' 標誌位來使 它們匹配內嵌的換行符。你還能夠設定 's' 標誌位使句號 (.) 能夠也用來匹配換行符。 (順便提一下,使用相似上面 i 標誌位的用法,能夠在在模式內部改變這兩個標誌位。) 另外一方面,Vim 中的 ^ 和 $ 永遠匹配內嵌的換行符。但另外有兩個匹配原: \%^ 和 \%$,能夠分別用來匹配 (且只匹配) 文本的起始和結尾。對第二個問題,Vim 用 \_ "修 飾符" 來解決: 把它放在一個句號或字符類以前,對應的模式就能夠同時匹配換行字符。 最後,如下這些結構是 Perl 獨有的: - 在正則表達式內執行任意代碼: (?{perl 代碼}) - 條件表達式: (?(條件)真值表達式|假值表達式) ... 而這些是 Vim 獨有的: - 改變模式的 'magic' 屬性: \v \V \m \M (對於避免反斜槓很是有用) - 可選匹配原的序列: \%[atoms] - \& (\& 之於 \| 就像 "與" 之於 "或";它強迫多個模式在同一個位置匹配) - 經過行/列號匹配: \%5l \%5c \%5v - 設置匹配的開始和結束位置: \zs \ze {-n,m}{}
:mat :match :mat[ch] // 定義一個在當前窗口高亮顯示的模式。它會以 高亮。例: 除了 // 之外,任何字符均可以用來標識一個 的開始和結 束。要小心某些特殊的字符,例如 '"' 和 '|'。 該命令執行時, 必須已經定義。 對於 'hlsearch' 要高亮的字符,仍然適用 高亮,由於匹配 高亮的優先級比 'hlsearch' 要高。一樣的,語法高亮 (見 'syntax') 也被匹配否決。 使用 'hlsearch' 高亮顯示最近使用的查找模式對全部窗口都有 效,而以 ":match" 定義的模式僅僅對當前窗口生效。當切換至另外一個 緩衝區時,該設定被保留。 'ignorecase' 不起做用。在模式中使用 /\c 來忽略大小寫,不然, 大小寫老是區分的。 'redrawtime' 定義搜索模式匹配的最大時間。 匹配行尾而 Vim 只重繪部分顯示時,結果可能會令你意想不到。這是 由於 Vim 在重繪開始的行上尋找匹配的緣故。 另見 matcharg() 和 getmatches() 。前者返回上次 :match 命 令使用的高亮組和模式。後者返回 matchadd() 和 :match 二者定 義的全部高亮組和模式的列表。 :match 定義的高亮匹配僅限於三個 (除了 :match 之外,還有 :2match 和 :3match 可用)。而 matchadd() 無此限制,並且還 能排定匹配的優先級。 另外一個例子,高亮顯示虛擬第 72 列以後的全部文本: 要高亮顯示全部位於虛擬第 7 列的文本: 用兩個項目是爲了匹配那些佔用了超過一個虛擬列的字符,例如 TAB。 :mat[ch] :mat[ch] none 清除上次定義的匹配模式。 :2mat[ch] // :2match :2mat[ch] :2mat[ch] none :3mat[ch] // :3match :3mat[ch] :3mat[ch] none 和上面的 :match 徹底相似,但設置不一樣的匹配。這樣,同時能夠有 三組激活的匹配。若是不一樣匹配在相同位置出現,最小編號的匹配優 先。 ":3match" 命令用於 matchparen 插件。建議使用 ":match" 進行手 動的搜索,而 ":2match" 用於其它的插件。 vim:tw=78:ts=8:ft=help:norl: {group}{pattern}{group}:highlight MyGroup ctermbg=green guibg=green:match MyGroup /TODO/{pattern}{group}{group}注意:highlight rightMargin term=bold ctermfg=blue guifg=blue:match rightMargin /.\%>72v/:highlight col8 ctermbg=grey guibg=grey:match col8 /\%<8v.\%>7v/注意{group}{pattern}{group}{pattern}
Generated by vim2htmlhtml