Vim Pattern 特殊字元
分類
說明
Pattern 模式在 Vim 的 ex 命令中很常見,Pattern 可以使用正規表示式的特殊字元進行搜尋,本篇將記錄一些常用的特殊字元。
魔術
查看幫助文件:
:help /magic
因為特殊字元還會因為 magic 選項而讓特殊字元有不同的解釋方式,為了避免水太深淹到自己,我這裡只用一般的 magic。
普通匹配原
查看幫助文件:
:help pattern-overview
| 字元 | 匹配 |
|---|---|
| . | 匹配任何字元 |
| ^ | 行首 (在模式起始),一行的開頭 |
| $ | 行尾 (在模式結尾),一行的結尾 |
| \ | 轉義字元,與其他字元組合轉義 |
| [] | [] 內指定的任何字元之一 |
| () | 當作單一匹配原的組 |
| \< | 單字的起始 |
| \> | 單字的結尾 |
| \| | 分隔匹配模式 |
| \& | 鄰接分支 |
字元類別
查看幫助文件:
:help /character-classes
| 字元 | 匹配 |
|---|---|
| \a | 英文字母字元: [A-Za-z] |
| \A | 非英文字母字元: [^A-Za-z] |
| \d | 數字: [0-9] |
| \D | 非數字: [^0-9] |
| \f | 檔案名字元 (見 'isfname' 選項) |
| \F | 同 \f,但不包括數字字元 |
| \h | 字頭字元: [A-Za-z_] |
| \H | 非字頭字元: [^A-Za-z_] |
| \i | 識別字元 (見 'isident' 選項) |
| \I | 同 \i,但不包括數字字元 |
| \k | 關鍵字字元 (見 'iskeyword' 選項) |
| \K | 同 \k,但不包括數字字元 |
| \l | 小寫字元: [a-z] |
| \L | 非小寫字元: [^a-z] |
| \o | 八進制數字: [0-7] |
| \O | 非八進制數字: [^0-7] |
| \p | 可列印字元 (見 'isprint' 選項) |
| \P | 同 \p,但不包括數字字元 |
| \s | 空白字元: <Space> 和 <Tab> |
| \S | 非空白字元; 與 \s 相反 |
| \u | 大寫字元: [A-Z] |
| \U | 非大寫字元: [^A-Z] |
| \w | 單字字元: [0-9A-Za-z_] |
| \W | 非單字字元: [^0-9A-Za-z_] |
| \x | 十六進制數字: [0-9A-Fa-f] |
| \X | 非十六進制數字: [^0-9A-Fa-f] |
| \_X | 其中 x 可以是以上任一個字元: 對應字元類別加上換行 |
特殊符號
| 字元 | 匹配 |
|---|---|
| \b | <BS> |
| \e | <Esc> |
| \n | 換行字元 |
| \r | <CR> |
| \t | <Tab> |
倍數項
查看幫助文件:
:help pattern-multi-items:help /multi
一個匹配原後面可以跟著一個表示該匹配原匹配次數和方式的修飾。這個修飾稱為倍數。
| 字元 | 匹配 | 多寡 |
|---|---|---|
| * | 0或更多 | 盡可能多 |
| \+ | 1或更多 | 盡可能多 |
| \= | 0或1 | 盡可能多 |
| \? | 0或1 | 盡可能多 |
| \{n,m} | n 到 m | 盡可能多 |
| \{n} | n | 準確 |
| \{n,} | 最少 n | 盡可能多 |
| \{,m} | 0到 m | 盡可能多 |
| \{} | 0或更多 | 盡可能多 (和 * 相同) |
| \{-n,m} | n 到 m | 盡可能少 |
| \{-n} | n | 準確 |
| \{-n,} | 最少 n | 盡可能少 |
| \{-,m} | 0到 m | 盡可能少 |
| \{-} | 0或更多 | 盡可能少 |
\
當前面有一個反斜線時,這些字元具有特殊的意義。例如,a 符合字母 a,而 \a 符合任何字母字元。
另外一些字元即使沒有反斜線也代表特殊的意思。它們反而需要一個反斜線來配合按本義出現的自身。例如 . 符合任何字符,而 \. 則匹配點號。
[]
一個集合。一組由方括號括起來的字元。匹配集合中的任何一個字元。
轉義
集合中有些字元需要轉義:
| 字元 |
|---|
| \ |
| - |
| ] |
| ^ |
另外也可以透過插入位置,省略 \ 轉義,例如: - 將其作為第一個或最後一個字元 [-xyz],[^-xyz] 或 [xyz-],其他的省略轉義方法,請參考幫助文件。
^
如果集合以 ^ 開始,它匹配所有不在集合內的字元: [^xyz] 匹配任何不是 x、y 和 z 的字元。
-
如果集合中的兩個字元以 - 隔開,表示它們之間的所有 ASCII 字元。例如,[0-9] 匹配任何十進制數位。
字元類別
這裡的字元類別指的是集合中的字元類別。字元類別表達式被解釋為該字元類別所代表的字元集合。支援以下字元類別:
| 名稱 | 內容 |
|---|---|
| [:alnum:] | 字母和數位 |
| [:alpha:] | 字母 |
| [:blank:] | 空格和定位字元 |
| [:cntrl:] | 控製字元 |
| [:digit:] | 十進制數位 ‘0’ 到 ‘9’ |
| [:graph:] | ASCII 可顯示字元,不包括空格 |
| [:lower:] | 小寫字母 |
| [:print:] | 可顯示字元,包括空格 |
| [:punct:] | ASCII 標點字元 |
| [:space:] | 空白字元: 空格、字元、換頁等 |
| [:upper:] | 大寫字母 |
| [:xdigit:] | 十六進制數位: 0-9、a-f、A-F |
其他更多的類別請輸入 :help E944 查看。
等價類別 (equivalence class)
匹配的字元和被比較的字元 “幾乎” 相同,但重音的差異可以忽略。
例如: a à á â ã ä 都可以用 [[=a=]] 匹配。
範例
| 集合 | 匹配 |
|---|---|
| [xyz] | x、y 或 z 之一 |
| [a-z] | 小寫 a 到 z |
| [A-Z] | 大寫 A 到 Z |
| [a-zA-Z] | 小寫 a 到 z,大寫 A 到 Z |
| [0-9] | 0到9 |
| [:;()] | : 或 ; 或 ( 或 ) |
| [[:alnum:],.] | 字母和數位或 , 或 . |
\(\)
\(\) 會將括號範圍內的樣式儲存到保留緩衝區,之後就能用數字取代,例如: \1 代表匹配和第一個 \( 和 \) 之間的子表達式的匹配文字相同的字串。最多可以保留9個。
範例
\([a-z]\).\1 匹配 a 到 z 任一字元加上任何任一字元加上 a 到 z 任一字元,例如: ata,ehe,tot 等。此時 \1 代表 [a-z]。
:s/\(a\) \(b\)/\2 \1/ 將 “a b” 替換成 “b a”。
\<
匹配單字的開頭。
範例
\<as
匹配 ‘as’,’assert’,但是不會匹配 ‘glasses’。
\>
匹配單字的結尾。
範例
ss\>
匹配 ‘class’,’pass’,但是不會匹配 ‘expression’。
\|
一個模式 (pattern) 是由 \| 分隔開的一個或多個分支 (branch)。 它可以匹配其中的任何一個分支匹配的文字。例如: foo\|beep 可以符合 “foo” 或 “beep”。
範例
/foo\|bar
這個指令匹配了 “foo” 或 “bar”。
\&
一個分支是一個或多個被 \& 分隔的鄰接。它匹配最後一個鄰接,但僅僅當前面所的鄰接也在同樣位置匹配。
範例
/foobeep\&...
匹配 “foobeep” 中的 “foo”,因 . 匹配任一字元,所以上述意思為要匹配 “foobeep” 而且匹配中的 “foobeep” 還要匹配 ...。
/.*Peter\&.*Bob
匹配同時包含 “Peter” 和 “Bob” 的一行。
\=
範例
/folders\=
匹配 “folder” 和 “folders”。
\?
和 \= 一樣。
\{
範例
文字內容:
ck cok cook coook
/co\{0,}k
匹配 ck, cok, cook, coook。
\{-
使用方法同 \{ 但會匹配盡可能少,目前尚未清楚匹配盡可能多和少的差異,等以後了解了再更新。
範例
文字內容:
ck cok cook coook
/co\{-1,}k
匹配 cok, cook, coook。
特別用法
/^$/
匹配沒有任何字元的一行。
/^[ tab]*$/
匹配空白行,和只有空格的行,tab 意思是 tab 鍵的定位符號。
/^[ tab][ tab]*$/
匹配只有包含一到多個空格的行。
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!