[Vim] 搜索模式(正則表達式)


本文介紹如何使用Vim的搜索模式。

 

搜索單詞

Vim中使用 \< 和 \> 分別表示單詞的開頭和結尾,例如查找單詞 i 而不是字母 i ,在正常模式下,按下 / 啟動搜索模式,輸入 \<i\> ,敲擊回車即可。

要查找當前光標覆蓋的單詞,敲擊 * ,Vim會自動啟動搜索模式,光標移動到該單詞下一個現身位置。

 

搜索當前單詞並連續修改

假定當前光標覆蓋的單詞為 foo,按下 * 鍵,Vim 會搜索並跳轉到下一個 foo 的位置,按下 ciw 組合鍵,意思是 change inner word ,此時 foo 會被刪除,在原位置輸入 bar ,然后按下 Escape 鍵。這就完成了一次搜索並修改,接下來按 n 鍵繼續搜索,如果還需要修改,則按下 . 鍵表示重復修改動作,如此反復完成連續搜索與修改。

 

搜索連續重復單詞

有時你可能會連續重復輸入同一個單詞而不自知,例如以下文本:

1 hello hello
2 world  world
3 thank
4 thank

搜索模式:

\(\<\w\+\>\)\_s*\1

以上搜索模式會匹配文本中的1-4行。在Vim中,使用 \( 和 \) 包括的部分視為一個原子,其中 \(\<\w\+\>\) 匹配一個單詞原子,\s 匹配空格符和tab符, \_s 匹配空格符、tab符和換行符, \_s* 匹配0次或多次。

 

搜索A或B

使用 \| 表示或邏輯,例如 red\|green\|blue 匹配字符串(注意不是單詞)red或green或blue。

如果要將匹配的對象替換成新的字符串,可以使用 :%s/搜索正則/新字符串/g,例如將所有的red或green字符串替換為purple:

:%s/red\|green/purple/g

替換所有單詞red或green為單詞purple:

:%s/\<\(red\|green\)\>/purple/g

 

Vim具有搜索模式記憶,因此以上命令也可以拆解為兩步:

第一步:搜索單詞red或green:

/\<\(red\|green\)\>

第二步:將搜索結果替換為purple:

:%s//purple/g

替換命令中搜索正則為空時,Vim會直接使用最后一次使用過的搜索正則作為默認表達式。

 

有時我們並不想替換結果,而是想要對結果做一些裝點,那么可以使用 & 來引用搜索結果,例如以下示例會將文本中所有的單詞red或green添加上引號:

:%s/\<\(red\|green\)\>/"&"/g

或者使用分組 \1, \2, \3 ... 來引用搜索結果:

:%s/\<\(red\|green\)\>/"\1"/g

 

  • 搜索與替換

  :substitute 命令搜索一個字符串並將其替換為新字符串,以下為一些基本使用方法。

:%s/foo/bar/g
    全文搜索每個foo並替換為bar。

:s/foo/bar/g
    當前行搜索每個foo並替換為bar。

:%s/foo/bar/gc
    全文搜索每個foo並替換為bar,替換前需要確認。

:%s/\<foo\>/bar/gc
    全文搜索每個單詞foo並替換為bar,替換前需要確認。

:%s/foo/bar/gci
    全文搜索每個foo並替換為bar,替換前需要確認,大小寫不敏感。

:%s/foo/bar/gcI
    全文搜索每個foo並替換為bar,替換前需要確認,大小寫敏感。

標記g:表示全局搜索,對每一個匹配結果進行操作,缺省標記g,則只對第一個匹配結果進行操作。
標記c:表示操作前需要進行確認。
標記i:表示大小寫不敏感。
標記I:表示大小寫敏感。

 

  • 搜索分組

  使用 \( 和 \) 包圍住表達式使其成為一個原子,並根據原子所處位置順序使用\1,\2,……來引用相應的匹配結果。最常見的場景莫過於對調字符串位置,例如:

原文:
1. France VS Germany
命令: :s/\(France\)\(\sVS\s\)\(Germany\)/\
3\2\1
結果: 1. Germany VS France

 

搜索A與B

使用 \& 表示與邏輯,例如搜索同時包含了 red 和 blue 的行。進行與邏輯搜索時,Vim按照由 \& 分隔的表達式順序逐一匹配,因此如果開啟了高亮匹配結果的功能,那么你看到高亮匹配的永遠都是最后一個表達式的匹配結果。

/.*red\&.*blue

 

反向肯定預查搜索

使用 \(expression1\)\@<=expression2 表示反向肯定預查搜索模式,其過程為首先搜索 \@<= 右側的原子即 expression2,遇到匹配項后再檢查匹配結果左側是否滿足 expression1。例如以下命令會搜索多個冗余0的數字。

原文:
1.0 1.000 1.0100

命令:
\(\.\d\+\)\@<=0\+\>

結果:
匹配了1.000后兩個0,1.0100后兩個0。

 

參考一 

參考二 

參考三


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM