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]*$/
匹配只有包含一到多個空格的行。
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!