Vim 中使用正則表達式
相信大家對于正則表達式的概念應該不會陌生,正則表達式以一種能夠快速匹配文本的方式,同樣的作為時下最流行的編輯器,Vim 中也支持使用正則表達式,這個小節就讓我們一起來看下如何在 Vim 中使用正則表達式。
1. 正則表達式概念
正則表達式(英文:regular expression),是一種文本模式。它賦予了 Vim 描述和分析文本的能力??梢愿鶕枰咝У卦鰟h改查各種類型得文本和數據。
實際工作中,無論是開發還是運維、測試等從事IT的人來說。正則表達式都是工作中必不可少的。它可以滿足高效簡潔地查找某些復雜規則的字符語句的需要。比如說以下幾個場景:
- 對身份證號碼 / IP 等匹配檢查
- 網頁對登陸名為手機號碼匹配
- 特定規律字符串的處理
- 提取郵件某些開頭規律行
- 可以結合其他額外工具(grep、sed 等)高效處理文本
2. 正則表達式規則
Tips: 正則表達式= 特殊字符(元字符) + 文本(普通字符)
上面的公式其實就是一個完整的正則表達式,你可以簡單的將正則表達式理解為是一種語言,元字符就是它的語法,普通字符就是單詞。
我們來看一個簡單的正則表達式的例子:
對于不太了解正則表達式的人來說這段簡單的公式是有點云里霧里的。下面我們來具體看下正則表達式具體語法規則有哪些,然后再回過頭來看就一目了然了。
2.1 正則表達式思維
-
正則表達式按照字節或者字符作為匹配單位的。而不是單詞或者句子。比如上述表達式我們簡化下grep -E ‘bat’。 本質上不是匹配的 bat 這個單詞,而是匹配 b,a,t 作為連續字符。
-
字符組:[0-9]:中括號作為正則表達式結構體,可以允許匹配結構體內任意匹配字符。比如這里的 [0-9] 匹配 0-9 之間任意一個數字。
Tips: 只有字符組內連字符 - 才是元字符。
-
多選結構:這就是我們剛才演示的例子。(a|b)——小括號中|作為元字符意思是或意思可以同時匹配 a、b.
下面我們來看下常用的具體表達式。
2.2 常用元字符
字符 | 含義 |
---|---|
. | 匹配除換行符以外的任意字符 |
\w | 匹配字母或數字或下劃線或漢字 |
\s | 匹配任意的空白符 |
\d | 匹配數字 |
\b | 匹配單詞的開始或結束 |
^ | 匹配字符串的開始 |
$ | 匹配字符串的結束 |
2.3 重復匹配
字符 | 含義 |
---|---|
* | 重復零次或更多次 |
+ | 重復一次或更多次 |
? | 重復零次或一次 |
{n} | 重復n次 |
{n,} | 重復n次或者更多次 |
{n,m} | 重復n到m次 |
根據這些表達式+上述的正則表達式思想可以解決大部分正則表達式應用。本篇主要針對 Vim 正則表達式講解所以更加復雜的正則表達式就不再贅述。根據上面的鋪墊,下面會結合 Vim 場景應用講解正則表達式。
3. Vim 正則表達式引擎
Vim 的正則表達式引擎和 Perl 相比不太一樣。語法更接近于 POSIX。對于我們一般使用關了 Perl 正則表達式開發人員來說,使用方式的沖突會很不友好。但是通過 magic 開關設置可以滿足不同的使用場景。
3.1 magic
根據之前對正則表達式的講解,我們知道正則表達式中有大量的有特殊含義的元字符。但是在使用 Vim 過程中會對普通用戶帶來不友好的使用體驗。比如要搜索 bat,這里是元字符所以不轉義無法搜索到。所以為了滿足不同使用習慣和使用人群。Vim 加入了四種不同 magic 模式。
快捷鍵 | 含義 | 解釋 |
---|---|---|
\v | very magic | 除了數字和大小寫字母、下劃線之外,都有特殊含義 |
\m | magic | ^ $ . * ~ []等具有特殊含義 |
\M | nomagic | 僅 ^ $具有特殊含義 |
\V | very nomagic | 大多數字符都表示其本身,除了反斜杠\ |
這里我們可以看到如果針對使用習慣一般正則表達式人來說,可以設置為very magic。我們可以針對上面的小例子展示下。
我們會通過\V 和 \v 不同模式下通過正則表達式查找以 resource 開頭的行。
可以看到不同模式結果是不一樣的。其他兩種模式也是類似。大家可以手動自己操作下。
4. 小結
Vim 中正則表達式為了滿足不同需求引入了 magic 開關。都有著各自使用場景:
- very magic: 適用于偏好使用大量正則表達式的開發人員
- very nomagic: 使用于普通用戶,可以不必在意正則表達式元字符轉義問題。
- magic: 這個是開啟了正則表達式的簡單版,默認可以使用這個模式,兼顧效率和使用場景。
- nomagic: 這個只用于匹配特定行尾。