Vim Pattern 特殊字元


建立時間: 2023年10月6日 09:21
更新時間: 2023年12月27日 08:38

說明

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]*$/
匹配只有包含一到多個空格的行。

觀看次數: 1108
characterexpressionmetapatternregular
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!