2010年1月23日 星期六

vim 的 search 搜尋功能

若要在一個文件中,同時找到「肥仔魚」、「肥仔豬」、「肥仔貓」,有一個規則的字串,可以使用正規表示式。
/肥仔[魚豬貓」
就可以找到,[]表示的是一個字元,但是,可以被選擇的就是中間的那三個字元~

如果我們今天要找的是英文文件,想要搜尋的 lemon tree、lemon soup、lemon juice 的話,就必需使用「\|」這個「或(or)」運算
/lemon tree\|lemon soup\|lemon juice

想要搜尋的東西會是像這樣 1234- 1234-5 1234-56 1234-567 1234-789 1234-2399 1234349898。

我們大概可以分析一下,這個字串大約是以1234開頭,然後跟上或不跟上「-」之後,再接上一堆數字。先把指令給大家:

/1234[-]\{,1}[0-9]\{1,}

或是:

/1234-[0-9]\{1,}\|1234[0-9]*

我們可以先看第一個方法,在第一個方法裡面用了兩個特別的東西:\{1,}\{,1}。在前面我們剛剛說中括號後面如果不跟上任何東西就表示中括號裡面的某一字元要出現一次。而現在\{n,m}就是用來表示可以對中括號裡面的字元挑選幾次。(選幾次就會出現幾個字元)

\{1,}表示至少要出現一次(至少選一次),而\{,1}表示最多出現一次(最多選一次,不選的話就代表中括號裡面的字元都不出現)。當然我們也可以寫成\{3,9},這就表示可以在中括號裡面的字元挑選三到九次,也就是會出現三到九個中括號裡面出現的字元。

而在第二個方法裡面,則在中括號後面緊跟著一個「*」,這其實代表\{0,},也就是 0 個到任意個都可以的。而中括號裡面我們用了「0-9」這就表示 0123456789 都可以。同樣對於字母我們也可以用「a-z」表示所有小寫英文字母和「A-Z」用來表示所有的大寫字母。

儘管如此,我們可能還是不滿足。舉例來說,我可不可以只找以「傷寒」開頭的字串或是以「主之。」結尾的字串?

假如我們只想找以「傷寒」開頭的字串,可以這樣輸入搜尋命令:

/^傷寒

^」開頭就表示要找的東西是一行的開頭。

但是有時候為了排版需要,在「傷寒」前面可能會出現一些空白或是 tab ,如果我們只是用上面的指令就不夠。所以配合我們剛剛的中括號帶次數的方式就可以做到:

/^[\t <Space>]*傷寒

<Space>是為了網頁展示可能看不到所以用<Space>來表示空白。而「\t」則是 vim 中用來表示 tab ,所以上面的命令就代表一行的開頭有任意個空白或是 tab 的混合,而其後跟上「傷寒」兩個字。

那結尾呢?還記得我們怎麼把游標移到行尾嗎?就是用「$」這個符號。所以要找以「主之」結尾的字串就可以用:

/主之$

不過你可能還是不滿意,比方說 vim 可不可以幫我找出忘了在句末補上句號的地方?可以!我們先看指令:

/.*[^。]$

或是不要看到整句:

/[^。]$

中括號裡面的字元 X 如果前面出現「 ^ 」就表示除了 X 以外的字元都算是想要比對的字元。所以上面第一個的指令就表示搜尋句末沒有句號的行(這一行至少要有一個字元,因為用了[^。]$,而不是 [^。]*$)。第二個指令比較不一樣是只搜尋句末不是以句點結束的字元。其實看哪個指令對你來說比較「順眼」就用哪個。

有關這些特殊符號還有許多更 powerful 的功能,你可以在 vim 的指令模式下打 :h pattern 看更詳細的資料。或用 :h regular 看有關 regular expression 的詳細說明。

現在,你已經可以用 vim 編輯、刪除,也可以做搜尋了,基本的 vim 操作到這裡已經可以說是差不多了。

[2020.05.29 補充]
確認是否是數字
其中包含負數與小數的情況
^-?\s*?([\d\,]+(\.\d{1,})?|\.\d{1,})\s*$


參考資料:
vim 的 search 搜尋功能
javascript - 带小数位的数字,以允许在正则表达式验证中使用逗号

1 則留言:

小中 提到...

/[^。^]$ 原來vim的指令是由表情符號發展而來啊~~~