----- 最近更新【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 著 張杰良 譯