正則表示式用於處理文字,精通運用正則表示式可以有效的解決工作的效率

正則表示式有基礎正則表示式和擴充套件正則表示式區別

grep支援基礎的正則表示式,grep -E (egrep)支援擴充套件正則表示式

1、脫字元號(^)、美元符號($)

脫字元號和美元符號實質上匹配的是一個位置(即定位),分別錨定一行的行首(^)和一行的行尾($)

在這裡詳細說明一下理解正則表示式是習慣:

^hel

^鎖定一行的開始,接下來是字元h,緊接著是字元e,最後是字元l

只要滿足這個標準,至於小寫字母 L 之後是否存在字元就不在考慮範圍之內了,這樣理解正則表示式就很容易了

2、字元組 []

字元組匹配的是一組字元集合中的一個字元(必須匹配到一個字元)。(字元組巢狀使用變化多)

例: gr[ea]y     意思是:先找到字元g,接下來是字元r,緊接著是字元e或者a,最後是字元y,[]內含義是或者的意思

顯然,gr[ea]y 並不匹配gry,這是因為[ea]佔用一個位置字元,如果沒有gray或者grey,則命令反饋為空白

字元組中還包含兩個元字元:-(連字元)和^(排除符號)

-(連字元)在字元組[]中只有在兩個字元中間才是表示範圍的意思,例:<H[1-6]>,表示匹配<H 1>、<H 2> 、<H 3> 。。。。。

同時多重範圍也是允許的。[0-9A-F_!.?] 表示匹配一個數字、一個大寫字母、下劃線、感嘆號、點、問號,字元組內的順序無關緊要。

有人會問 ?字元(?)不是正則表示式,匹配前一個字元0個或者1個嗎?怎麼又是匹配?問號呢?  說明一下,字元組中符號-和^才是解釋為正則表示式,其他都是普通字元

注意在字元組中,-和^也不是一定就是解釋為正則表示式,位置很關鍵?如果-在[中括號後的第一個字元,那麼就表示普通字元-,如果^不是[中括號後的第一個字元,也不表示排除的意思

第一個-連字元是解釋為a到z的範圍,第二個-僅僅解釋為普通字元-,這樣就匹配到了字元h-lo

排除型字元組(^)

[^ ]取代[ ],^在字元組內的含義是排除的意思,例[^3-6] 表示排除數字3 、4、5、6之外的所有字元,不僅包含了1、2、7.。。。數字,大小寫字母,還包含了特殊字元.?!~等等

kal[^a] 匹配了kali,卻沒有匹配kal,這就是我之前說的字元組[]和[^]佔用一個匹配位,如果kal之後沒有字元是匹配情況的。

後面會結合字元組列舉一些技巧

3、句點符號(.

表示用來匹配任意一個字元,空格也可以匹配

多選結構

4、字元 | 匹配任意子表示式

利用擴充套件正則表示式字元 | 可以篩選多個選項。例: “Bob|Robert”注意字元 | 兩邊沒有空格,表示包含Bob或Robert字串的行

多選結構的正則表示式字元 | 與字元組[]相似,字元 | 有或者的含義,同時字元組[]內的字元也有或者的含義,但是也有明顯的區別:字元組[]僅僅佔用一個字元位,而字元 | 兩邊卻是完整的正則表示式

一般| 都結合()一起來使用

()實際上是確定的多選的範圍,所以(a|e)與[ea]效果是一樣的,同時如果去除(),gre|ad 則表示包含gre或ad的行

三種表示式,反映的效果都是一樣,反斜槓用於遮蔽句點符號.

至於第三個表示式,嘗試用上面理解正則表示式的方式解讀一下:

(Fire|l)st\.[Ss]treet        首先查詢包含字串Fire或者L(小寫)接下來查詢Fire後面是否緊跟字元s和t(不是就排除),或者是L(小寫)後面是否是緊跟s和t,再接下來是句點,接著句點之                後是否是大寫s或者小寫s,大小寫s之後是treet

對於^(Geo|Je)ff(rey|ery) 表示開頭字元是Geo或者Je,拆開就是^Geo、 ^Je

如果是^Geoff|Jeff(rey|ery) 是表示什麼呢?   匹配一行開始是Geoff的行,或者包含字串Jeffery或Jeffery的行

5、單詞分界符\<和\>  有些egre不支援單詞分界符

\<    針對單詞,表示匹配單詞的開頭字元. \<the

\>    針對單詞,表示匹配單詞的結尾. the\>

與^$相似,只是^$針對行,\<和\>針對單詞,所以\<the\> 表示匹配單詞的開頭為the,結尾也是the,也就是匹配單詞the,所以是精準匹配單詞

END