一、正則表達式概述
什么是正則表達式?
正則表達式是一種描述字符串匹配規則的重要工具
1、正則表達式定義:
正則表達式,又稱正規表達式、常規表達式
使用字符串描述、匹配一系列符合某個規則的字符串
正則表達式
普通字符:
大小寫字母、數字、標點符號及一些其它符號
元字符:
在正則表達式中具有特殊意義的專用字符
正則表達式的層次分類
基礎正則表達式
擴展正則表達式
Linux三劍客(grep、sed、awk)支持的正則表達式
shell是不支持正則表達式的(shell支持的是通配符)。shell中的正則表達式只有個別命令支持的,一般常用的是Linux三劍客
支持正則的shell命令 | 正則類型 |
---|---|
grep | 默認使用基本正則表達式(BRE)(要使用擴展正則需要加轉義字符) |
egrep 或grep -E | 使用擴展的正則表達式(ERE) |
sed | 默認使用基本正則表達式(BRE) |
awk | 使用擴展正則表達式(ERE) |
2 基礎正則表達式的元字符
基礎正則表達式是常用的正則表達式部分
2.1 匹配字符
\ : 表示轉義字符,去掉特殊符號的特殊含義
\n : 匹配換行符
\t : 匹配制表符
\w : 匹配單詞字符(單詞字符:a-z,A-Z,0-9,_ )
\W : 匹配非單詞字符
\S : 匹配非空白字符
\s : 匹配空白字符
\d : 匹配數字
\D : 匹配非數字
. : 表示匹配任意單個字符(默認情況下,. 無法匹配換行符)
2.2 中括號表達式
字符組: 普通中括號包圍的字符組,表示某個單個字符匹配中括號內的任意字符即匹配成功
x[abc]z :
可以匹配包含“xaz”、“xbz”、“xcz”的字符串
取反表示法:
中括號內開頭使用 ^ ,表示只要不是中括號內的字符就匹配
x[ ^abc]z :
可以匹配包含 “xdz”、“xez” 等字符串,但不能匹配包含“xaz”、“xbz”、“xcz”的字符串
范圍表示法
[a-z]:
表示任意單個小寫字母
[ ^a-z] :
匹配非小寫字母的其它任意字符串
[A-Z] :
表示任意單個大寫字符
[0-9] :
表示任意單個數字
注意:[0-59],表示匹配0、1、2、3、4、5、9,而不是0-59中間的數值
[a-z0-9A-Z] : 表示任意字母或數字
[a-z0-9A-Z_] : 表示任意字符、數字或下劃線,也就是匹配單個字符
特殊的元字符在中括號中匹配
想要在中括號中匹配: ^ ,需要將其放在 中括號非開頭的位置 ,如:[a^]
想要在中括號中匹配: - ,需要將其放在 開頭位置或結尾位置 ,如:[abc-]、[-abc]
想要在中括號中匹配: ] ,需要將其放在 開頭位置 ,如:[]abc]
2.3 位置匹配(錨定)
只匹配位置,不匹配字符,所以不會消耗字符數量,也稱為零寬斷言
^ : 匹配行首
$ : 匹配行尾
2.4 量詞(重復匹配次數)
\{m\} : 表示匹配前一個字符或前一個子表達式m次
\{m,n\} : (m<n)表示匹配前一個字符或前一個字表達式最少m次,最多n次
\{m,\} : 表示匹配前一個字符或前一個子表達式至少m次
\{,n\} : 表示匹配前一個字符或前一個字表達式最多n次(匹配0次也算是成功)
*: 表示前一個字符或前一個子表達式匹配0次或多次,等價于:{0,}
.* : 匹配任意長度的任意字符
**注意:這些量詞均為貪婪匹配模式,就是盡可能的去匹配符合條件的字符,例如:ab. *c 去匹配字符串:abbcdecfc,其中. * 部分匹配的將是bcdecf **
2 擴展正則表達式的元字符
2.1 擴展常用的量詞
? : 表示匹配前一個字符或前一個子表達式0或1次,等價于:{0,1}或者{,1}
+: 表示匹配前一個字符或前一個子表達式1次或多次,就是最少一次,等價于:{1,}
2.2 二選一表達式
豎線 | 分隔左右兩個正則子表達式,表示匹配任何一個即可,即a|b表示:a或者b,在結果上等價[ab];但是:[0-5] |\sa 表示0、1、2、3、4、5 或者 “ a”,這種轉化不了為[]的形式。
使用二選一子表達式需要注意:
二選一元字符優先級很低,所以abc|def 表示的是abc或者def,等價于:(abc)|(def),而不是ab(c|d)ef。
2.3 分組捕獲和反向引用
使用小括號()包圍一部分正則表達式,這部分正則表達式即成為一個分組整體,也稱為一個子表達式。
根據左括號的位置決定第幾個分組
例如:(abc)def 、([a-d]){3}、 ([0-9]abc(def){2}(hgi))。
分組后可以使用\N 來反向引用對應的分組匹配結果,N是1-9的正整數,\1表示第一個分組表達式的匹配結果,\2表達第二個分組表達式的匹配結果。
注意:反向引用引用的是分組匹配后的結果,不是分組表達式
例如:正則表達式:(abc|def) and \1xyz 可以匹配字符串“abc and abcxyz ” 或“def and defxyz”,但是不能匹配“abc and defxyz” 或 “def and abcxyz”
?
二、grep命令的使用
1、grep命令簡介
grep是一種強大的文本搜索工具,它能使用正則表達式,并把匹配的行打印出來。
格式
grep [options] pattern [file]options表示:選項; pattern 表示:匹配的的表達式 ; file 表示:文件名例如:grep -i "root" /etc/passwd
2、常用選項
常用選項 | 功能 |
---|---|
-n | 列出所匹配的文本行,并顯示行號 |
-i | 匹配時忽略字符大小寫 |
-v | 反向匹配,匹配的字符串與搜索的不相符 |
-w | 精確匹配。匹配整個單詞 |
-o | 只顯示匹配的部分 |
-c | 顯示匹配內容的行數 |
3、grep 的選項使用案例
案例:過濾出/etc/passwd中的root,并添加行號(-n)
?
案例:過濾出/etc/passwd 中的FTP,不區分大小寫(-i)
案例:過濾/etc/passwd 中的不包含root的行,并且顯示行號(-v)
?
案例:精準搜索單詞,只匹配到單詞所在的行(-w)?
?案例:將匹配到的單詞羅列出來(-o)
?案例:顯示匹配的內容的行數(-c)
三、grep加上正則使用案例
1、中括號表達式案例
案例1:搜索既可以查找shirt也可以查找short的單詞所在行
?
?案例2:搜索oo前面不是大小寫字母開頭的行
案例3:查找包含數字的行?
2、位置錨定案例
案例1:搜索以.結尾的行
案例2:搜索以y開頭的行?
3、量詞案例
案例1:搜索2個oo的行?
?
為了匹配了6個o,但是要求搜索的是2個o?答:因為正則表達式是一行一行的檢索的,表達式是2個o,搜索的內容時一個很長的字符串。
先拿表達式中的第一個字符與字符串匹配,匹配不到,進行下一個匹配,最后匹配到了mgoooooood中的o
匹配成功,然后匹配第二個o,也匹配成功,然后就會將匹配的兩個字符消耗掉,再繼續重新匹配到下一個字符
最后消耗掉三次,也就是6個o,第7個o雖然匹配成功,但是第8個字符不是o,所以不會匹配成功。
?案例2:查看o這個字符,最少出現3次,最大出現6次
案例3:查找o這個字符,最少出現5次的行?
案例:特殊的量詞案例?
4、二選一表達式和分組案例
案例1:搜索以y開頭或者以d結尾的行
案例2:搜索shirt和short所在的行?
?四、總結
正則元字符 | 描述 | grep | egrep | sed | awk |
---|---|---|---|---|---|
\ | 轉義符,將特殊字符進行轉義,忽略其特殊意義 | 支持 | 支持 | 支持 | 支持 |
^ | 匹配行首 | 支持 | 支持 | 支持 | 支持 |
$ | 匹配行尾 | 支持 | 支持 | 支持 | 支持 |
. | 匹配除換行符\n 之外的任意單個字符 | 支持 | 支持 | 支持 | 支持 |
[] | 匹配包含在[字符]之中的任意一個字符 | 支持 | 支持 | 支持 | 支持 |
[^] | 匹配[ ^z字符]之外的任意一個字符 | 支持 | 支持 | 支持 | 支持 |
[-] | 匹配 []中指定范圍的任意一個字符,要寫成遞增 | 支持 | 支持 | 支持 | 支持 |
* | 匹配前導字符或子表達式0次或多次 | 支持 | 支持 | 支持 | 支持 |
? | 匹配前導字符或子表達式0次或1次 | 不支持(加\) | 支持 | 不支持(加\) | 支持 |
+ | 匹配前導字符或子表達式1次或多次 | 不支持(加\) | 支持 | 不支持(加\) | 支持 |
() | 匹配表達式,創建一個用于匹配的字串 | 不支持(加\) | 支持 | 不支持(加\) | 支持 |
{n} | 匹配前導字符或子表達式n次,可以為0 | 不支持(加\) | 支持 | 不支持(加\) | 支持 |
{n,} | 匹配前導字符或子表達式至少n次 | 不支持(加\) | 支持 | 不支持(加\) | 支持 |
{n,m} | 匹配前導字符或子表達式,最少匹配n次,最低匹配m次,n<=m | 不支持(加\) | 支持 | 不支持(加\) | 支持 |
| | 交替匹配| 兩邊的任意一項 | 不支持(加\) | 支持 | 不支持(加\) | 支持 |
?
?