Linux深入探索10-正則表達(dá)式

----- 最近更新【2022-01-15】-----

一、簡(jiǎn)介

正則表達(dá)式(regular expression)通常簡(jiǎn)寫為 regex 或 re,是一種指定字符串模式的簡(jiǎn)潔方式。

正則表達(dá)式可以用于許多種編程語(yǔ)言中,例如:Awk、C、C++、C#、Java、Perl、PHP、Python、Ruby、Tcl和VB.NET等。盡管正則表達(dá)式在各個(gè)程序之間有所不同,但是基本思想總是相同的。

二、匯總表

正則表達(dá)式的強(qiáng)大來(lái)自擁有特殊含義的元字符和縮寫的使用。在正則表達(dá)式中,普通字符匹配自身,特殊字符擁有特殊的含義。

元字符:

元字符 含義 例子
. 除新行字符外,匹配任意的單個(gè)字符
^ 錨:匹配行的開頭
$ 錨:匹配行的末尾
\< 錨:匹配單詞的開頭
\> 錨:匹配單詞的末尾
[list] 字符類:匹配 list 中的任何字符
[^list] 匹配不在 list 中的任何字符
( ) 組:視為一個(gè)單獨(dú)的單元
| 交變:匹配選擇之一
\ 引用:從字面上解釋元字符

重復(fù)運(yùn)算符:

運(yùn)算符 含義 例子
* 匹配 0 次或多次
+ 匹配 1 次或多次
? 匹配 0 次或 1 次
{n} 限定:匹配 n 次
{n,} 限定:最少匹配 n 次
{0,m} 限定:最多匹配 m 次
{,m} 限定:最多匹配 m 次
{n,m} 限定:最少匹配 n 次,最多匹配 m 次

注意:有一些程序不支持{,m},因?yàn)樗皇菢?biāo)準(zhǔn)的。

預(yù)定義字符類:

類似于 含義 例子
[:lower:] a-z 小寫字母
[:upper:] A-Z 大寫字母
[:alpha:] A-Za-z 大小寫字母
[:alnum:] A-Za-z0-9 大小寫字母、數(shù)字
[:digit:] 0-9 數(shù)字
[:punct:] 標(biāo)點(diǎn)符號(hào)
[:blank:] 空格或制表符(空白符)

注意:方括號(hào)和冒號(hào)是名稱的一部分

三、歷史版本

Unix 支持兩種主要的正則表達(dá)式變體:一個(gè)現(xiàn)代版本,一個(gè)以前的廢棄版本。

現(xiàn)代版本的正則表達(dá)式是擴(kuò)展正則表達(dá)式(extended regular expression),或者簡(jiǎn)稱為 ERE。它是當(dāng)前的標(biāo)準(zhǔn),屬于 IEEE 1003.2 標(biāo)準(zhǔn)(POSIX 的一部分)。

以前版本的正則表達(dá)式是 基本正則表達(dá)式(basic regular expression),或者簡(jiǎn)稱為 BRE?,F(xiàn)在 BRE 已經(jīng)被廢棄,保留它們只是為了與舊程序兼容。

例如 sed 程序默認(rèn)使用的就是基本正則表達(dá)式,需要使用擴(kuò)展正則表達(dá)式則要帶上相應(yīng)選項(xiàng),即sed -E。

1、版本區(qū)別:

基本正則表達(dá)式 和 擴(kuò)展正則表達(dá)式 之間的主要區(qū)別就是,對(duì)于基本正則表達(dá)式來(lái)說(shuō),有些特定的元字符不能使用,而其它元字符必須使用反斜線(\)引用。

不能使用的元字符有:?、+|
必須轉(zhuǎn)義的元字符有:{ }、( )

2、區(qū)別總結(jié)

擴(kuò)展正則表達(dá)式 基本正則表達(dá)式 含義
{ } \{ \} 定義一個(gè)限定
( ) \( \) 定義一個(gè)組
? 可模擬為:\{ 0,1\} 匹配 0 次或 1 次
+ 可模擬為:\{ 1,\} 匹配 1 次或 多 次
| 不支持 交變:匹配選項(xiàng)中的一個(gè)
[:name:] 不支持 預(yù)定義字符類

四、案例說(shuō)明

測(cè)試文本 letter.txt 的內(nèi)容如下:

[nosee@instance-4 ~]$ cat letter.txt 
Dear Miss Hanff:
    Thank you very much for your letter,
I appreciate your kindness in telling me
the cloth I worked has given you so moch
pleasure. I only wish I could do more.
I expect Mrs. Doel has told you I am
getting on in years so I am unable to do
as much as I used to. It is always a joy
to me when my work gets into the hands
of someone who appreciates it.
    I see Mrs. Doel most days, she often
speaks of you. Perhaps I may see you if
you come to England.
    Again thanking you

            Jan. 29th,1952
                    Yours very sincerely,
                    Mary Boulton

1、匹配行和單詞(錨的使用)

正則表達(dá)式中的“錨”,也就是使用以下4種元字符:

元字符 含義
^ 錨:匹配行的開頭
$ 錨:匹配行的末尾
\< 錨:匹配單詞的開頭
\> 錨:匹配單詞的末尾

1)行的開頭與末尾

例:匹配所有包含有 you 字符中的行

[nosee@instance-4 ~]$ grep you letter.txt 
    Thank you very much for your letter,
I appreciate your kindness in telling me
the cloth I worked has given you so moch
I expect Mrs. Doel has told you I am
speaks of you. Perhaps I may see you if
you come to England.
    Again thanking you

例:匹配所有包含有 you 字符串 并且 you 字符串位于行開頭的行

[nosee@instance-4 ~]$ cat letter.txt | grep '^you'
you come to England.

例:匹配所有包含有 you 字符串 并且 you 字符串位于行末尾的行

[nosee@instance-4 ~]$ cat letter.txt | grep 'you$'
    Again thanking you

Tip:搜索空行可以這樣:grep '^$'

2)單詞的開頭與末尾

例:查找所有包含有 le 字符串的行
[圖片上傳中...(image.png-5b6b3d-1642238499630-0)]

[nosee@instance-4 ~]$ cat letter.txt | grep le
    Thank you very much for your letter,
pleasure. I only wish I could do more.
getting on in years so I am unable to do

例:查找所有包含有 le 字符串的行,并且 le 字符串要位于單詞開頭

[nosee@instance-4 ~]$ cat letter.txt | grep '\<le'
    Thank you very much for your letter,

例:查找所有包含有 le 字符串的行,并且 le 字符串要位于單詞末尾

[nosee@instance-4 ~]$ cat letter.txt | grep --color 'le\>'
getting on in years so I am unable to do

在正則表達(dá)式中,“單詞”就是一個(gè)自包含,由字母、數(shù)字或者下劃線字符構(gòu)成的連續(xù)字符串。

Tip:
搜索完整單詞可以這樣:grep '\<單詞\>'
有些系統(tǒng)可以使用 \b來(lái)代替 \<\>,如grep '\b單詞\b'

2、匹配任意字符

元字符:.(點(diǎn)號(hào)),匹配任意的單個(gè)字符,除新行字符外。(新行字符標(biāo)記一行的末尾)

例:匹配一個(gè) “ Y 或 y 開頭,中間3個(gè)任意字符,以 s 結(jié)尾” 的單詞

[nosee@instance-4 ~]$ cat letter.txt | grep '\<[Yy]...s\>'
getting on in years so I am unable to do
                    Yours very sincerely,

3、字符范圍匹配 與 預(yù)定義字符類

使用預(yù)定義字符類時(shí),唯一需要注意的一點(diǎn)就是,方括號(hào)實(shí)際上是名稱的一部分。因此,使用時(shí)必須在包含第二組方括號(hào),以維持正確的語(yǔ)法。

例:查找包含有4個(gè)連續(xù)數(shù)字的行

[nosee@instance-4 ~]$ cat letter.txt | grep -E '[0-9]{4}'
            Jan. 29th,1952
[nosee@instance-4 ~]$ cat letter.txt | grep -E '[[:digit:]]{4}'
            Jan. 29th,1952

注:
以上兩個(gè)正則表達(dá)式含義是一樣的。
grep-E 選項(xiàng)是為了使用擴(kuò)展正則表達(dá)式。
連字符-也是元字符,當(dāng)需要匹配-本身時(shí)也需要轉(zhuǎn)義\-

例:匹配至少包含有10個(gè)字母的單詞

[nosee@instance-4 ~]$ cat letter.txt | grep -E '[[:alpha:]]{10,}'
I appreciate your kindness in telling me
of someone who appreciates it.
[nosee@instance-4 ~]$ cat letter.txt | grep -E '[A-Za-z]{10,}'
I appreciate your kindness in telling me
of someone who appreciates it.

例:搜索linux目錄/bin下,名字為 兩個(gè)a-g字母組成的單詞的程序

[nosee@instance-4 ~]$ ls /bin | grep -E '^[a-g]{2}$'
ab
dd
df

例:統(tǒng)計(jì)linux目錄/bin下,名字為兩個(gè)小寫字母組成的單詞的程序共有多少個(gè)

[nosee@instance-4 ~]$ ls /bin | grep -Ec '^[a-z]{2}$'
28

4、重復(fù)組

例:匹配任何 “i 或 I 開頭” 然后接 “一個(gè)小寫字母” 再接 “一個(gè)任意字符”,并且 “該模式出現(xiàn)兩次” 的字符串

[nosee@instance-4 ~]$ cat letter.txt | grep -E '([Ii][a-z].){2}'
as much as I used to. It is always a joy

參考:

書箱:《Unix & Linux 大學(xué)教程》第二十章 (美)Harley Hahn 著 張杰良 譯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容