vim 我最常用的 regular expression

Character set:
\s空白\a[A-Za-z]
\S非空白\l小寫字[a-z]
\d數字, 也等於[0-9]\u大寫字母[A-Z]
\D非數字\_x以上所有與換行符號
\x16進位數\n換行
\o10進位數\rCarriage Return
\w[0-9A-Za-z_]\eEscape
\h[A-Za-z_]\tTab

Example:
(1) :%s/\s\+$// 將每行後面多餘的空白去掉 ($代表一行的尾巴)。
(2) :%s/^\n// 將空白行去掉,也就是一行的開頭就接著換行符號的行(^代表一行的開端) 。
(3) :%s#//.*## 將"//..." 這樣的註解刪除; 這邊原本是要寫":%s/\/\/.*//g", 但vi可以讓你把/換成#,這樣pattern 的/就不用寫成\/來簡略寫法並提昇pattern可讀性; 當然,其他pattern你也可以用如":%s#like#love#"。
(4) /\d\+\.\d\+ 尋找浮點數, 例如 2.99, 0.1.
(5) :10, 521s/\[\(\d\+\\)]/_reg_\1/g ,行10到行521,將例如[33]換成_reg_33
(6) /\w\+_i 尋找例如, test_i, a9_tck_i...
(7) :%s/\t/ /g 將TAB換成空白

^一行的開始
$一行的結尾
.任何字元
\_.任何字元與換行符號
\<一個單字的開頭字母, 例如moon的m
\>一個單字的結束, 例如¨beach.¨的.
\%23l第23行
\%<23l第23行之前,即是第1到第22行
\%>23l第23行之後, 即第24行到最後行
\%93c第93欄 (column)
\%>93c第93欄之前
\%<93c第93欄之後


Example:
:exe '%s/\%' . col(".") .'c\w\+/lemon/' 在目前游標所在的欄全換成 lemon, 假設目前游標在第7欄, 這個命令就等於執行 "%s/\%7c\w\+/lemon/"。

Multi items:

*match 0次或多次;
例如, .* 代表match任何字元除了換行符號;
z*代表match 0個z到無限多個z
\+match 至少1次
例如, a\+可match到"a", "aa", "aaa"...etc
\=match 0次或1次
例如,foo\= 可match到"fo" 與 "foo"
\?跟\=一樣, 只是用?往回search時不能使用
\{n,m}match n到m個
\{n}match n 個
\{n,}match 至少n個
\{,m}match 0 到m個
\{}跟 * 一樣
\{-n,m}non-greedy mode. match n 到 m個, 但match 到最少數目.
例如, I'm sooooooo in love with you 用 o\{-2,7}只會match到oo, 但用 o\{2,7}會match到ooooooo.
\{-n,}non-greedy. match 至少n個, 但是match最少.
\{-,m}non-greedy, match 0 到m, as few as possible.
\{-}match 0 到無限多個, as few as possible.

Example:

(1) :%s#/\*\_.\{-}\*/##g 將 /*...*/註解拿掉, 包括/*與*/在不同行。
/\*代表/*, \_.代表任何字包括換行符號, \{-}代表match 0 到無限個但as few as possible, \*/代表 */; 如果你寫":%s#/\*\_.*\*/##g" ,也就是用greedy 的 * (match 0 到 無限多,as more as possible),那以下的內容:
/*
*comment a
*/
code a
/* comment b*/

取代完後,會整個區塊連 "code a" 都被刪除。

沒有留言: