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