近期研讀 伍之昂老師 的<<Linux Shell編程從初學到精通>>,這裏當作本身的學習筆記.正則表達式
元字符:元字符(Metacharacters)是用來闡釋字符表達式意義的字符,簡言之,元字符就是描述字符編程
的字符,它用於對字符表達式的內容、轉換及各類操做信息進行描述。bash
正則表達式:正則表達式是由一串字符和元字符構成的字符串,簡稱RE(Regular Expression)。正ide
則表達式的主要功能是文本查詢和字符串操做,它能夠匹配文本的一個字符或字符集合。實際上,正工具
則表達式完成了數據過濾,將不知足正則表達式定義的數據拒絕掉,剩下與正則表達式匹配的數據。學習
POSIX 標準將正則表達式分爲兩類:基本的正則表達式和擴展的正則表達式。ui
基本的正則表達式spa
基本的正則表達式元字符集合及其意義:
排序
![]() |
![]() |
下面逐個介紹正則表達式元字符的意義和用法,並舉一些例子結合使用元字符集合。ci
1."*"符號
"*"符號用於匹配前面一個普通字符的0 次或屢次重複,如:
hel*o
"*"符號前面的普通字符是l,*字符就表示匹配l 字符0 次或屢次,如字符串heo、helo、hello、hellllllo均可以由hel*o來表示。
2."."符號
點號"."用於匹配任意一個字符,如:
…73.
因爲"."符號只能匹配一個字符,所以,上述字符串表示前面三個字符爲任意字符,第4 和第5 個字符是7和3,最後一個字符爲任意字符,如xcb73八、4J973U都能匹配上述字符串。值得注意的是,"."符號能夠匹配一個空格,所以,x b73八、ui 73e也能匹配上述字符串。
3."^"符號
"^"符號用於匹配行首,表示行首的字符是"^"字符後面的那個字符,如:
^cloud
這表示匹配以cloud開頭的行。結合上面介紹的"*"符號和"."符號,再舉一個例子:
^…X86*
該字符串表示行首的三個字符爲任意字符(能夠是空格),第4~6 個字符爲X86,第7個字符開始能夠重複匹配6,如:866X8666六、8 6X86均可以匹配上述字符串。
4."$"符號
$符號匹配行尾,$符號放在匹配字符以後,與"^"符號的功能和用法都相反,如:
micky$
該正則表達式表示匹配以micky結尾的全部行。一個特殊的正則表達式是匹配全部空行的表達式,爲:
#表明一個空行 ^$
該正則表達式既匹配行首,又匹配行尾,中間沒有任何字符,所以,爲空行。須要牢記空行表示方法,不少命令都用到這個正則表達式來表示空行。
若是須要匹配只包含一個字符的行,以下所示:
^.$
5."[]"符號
方括號[]匹配字符集合,該符號支持窮舉方法列出字符集合的全部元素,也支持使用"-"符號表示字符集合範圍,代表字符集合範圍從"-"左邊字符開始,到"-"右邊字符結束。若是要匹配任意一個數字,可使用以下所示的兩種方法,前一種窮舉了阿拉伯數字,後一種用數字範圍表示,顯得比較簡潔。
#窮舉方法列出字符集合 [0123456789] #使用"-"來表示集合範圍 [0-9]
"[]"也能夠用作字母匹配,以下所示:
[a-z] #全部小寫字母 [A-Z] #全部大寫字母 [b-p] #小寫字母b~p
Linux 系統對大小寫是敏感的,而且支持字母排序,所以,Linux 中有大寫字母序列和小寫字母序
列,二者是分開的,a~z 表示全部的小寫字母,A~Z 表示全部的大寫字母,而b~p表示從b到p之間
全部的小寫字母。
咱們知道,"^"符號表示匹配行首,可是,"^"符號放到"[]"符號中就再也不表示匹配行首了,而是表示
取反符號,請看下面例子:
[^b-d]
"[^b-d]" 正則表達式匹配不在b~d範圍以內的全部字符,此時,符號"^"再也不表示匹配行首,而是取
反符號,不在b~d範圍內的字符實際上涵蓋了除了小寫字母b、c和d以外的全部字符(包括其餘字母、
數字、空格等)。再舉一個"[]"符號和"*"符號結合的例子。
[A-Za-z] [A-Za-z]*
上訴正則表達式表示以任意一個字母開頭,再以任意字母進行0 次或任意次重複,實際上,這個正則表達式能夠匹配任意英文單詞。
6."\"符號
"\"符號是轉義符,用於屏蔽一個元字符的特殊意義,即以字面含義來解釋"\"符號後面的元字符,如:
#轉義符號屏蔽元字符"."的特殊含義 \.
7."\<\>"符號
"\<\>"符號是精確匹配符號,該符號利用"\"符號屏蔽"<>"符號,如:
\<the\>
該正則表達式精確匹配the 這個單詞,而不匹配包含the 字符的單詞,如them、there、another 等。
8."\{\}"系列符號
"\{\}"系列符號與"*"符號相似,都是表示前一個字符的重複。可是,"*"符號表示重複0 次或任意次,而"\{\}"系列符號能夠指定重複次數,"\{\}"系列符號包括如下三種形式。
\{n\}:匹配前面字符出現n次。
\{n,\}:匹配前面字符至少出現n次。
\{n,m\}:匹配前面字符出現n~m次。
請看以下例子:
#\{\}系列符號的用法 JO\{3\}B #重複字符O 3 次 JO\{3,\}B #重複字符O 至少3次 JO\{3,6\}B #重複字符O 3~6次
JO\{3\}B表示重複字符O 3次,匹配值爲:JOOOB。
JO\{3,\}B 表示重複字符O 至少3 次,JOOOB、JOOOOB、JOOOOOB 等字符串均可由該正則表達式來匹配。
JO\{3,6\}B表示重複字符O 至少3 次,至多6次,JOOOB、JOOOOOOB等字符串都知足,可是JOOB、JOOOOOOOB等字符串就不知足。
再舉一個例子:
#精確匹配5個小寫字母 [a-z] \{5\}
上訴正則表達式表示精確匹配5個小寫英文字母,好比hello、house等。
擴展的正則表達式
除基本的正則表達式的元字符以外,awk 和Perl 等Linux 工具還支持正則表達式擴展出來的一些元字符,以下所示
擴展的正則表達式元字符集合及其意義:
![]() |
下面詳細介紹擴展的正則表達式元字符及其用法。
1."?"符號
匹配"?"符號以前的那個字符0 次或1 次,如:
#?符號的意義 JO?B
該表達式表示匹配O 字符0次或1 次,即匹配JB、JOB、JOOB等。須要注意的是,"?"字符至多能夠匹配1 個字符。
2."+"符號
與"*"符號相似,都是匹配其前面的那個字符屢次,可是,"*"符號能夠匹配0次,而"+"符號至少匹配1 次,如:
#+符號的意義 S+EU
該表達式表示匹配S 1 次或任意次,SEU、SSEU、SSSSEU 等字符串均可由該表達式進行匹配。
3."()"符合和"|"符號
"()"符號一般與"|"符號結合使用,表示一組可選字符的集合,如:
#()符號和|符號的意義 re(a|e|o)d
該表達式中的(a|e|o)表示在字符a、e 和o 中選擇任意一個字符,即read、reed、reod 均可由該表達式進行匹配。
事實上,()符號不多使用到,由於"[]"符號徹底可以替代"()"符號表示一組可選字符的集合,re(a|e|o)d就等價於re[aeo]d。
"|"符號也能夠表示多個正則表達式的"或"關係,基本格式爲:
RE1 | RE2 | RE3 |…
上述格式中,RE一、RE2和RE3表示正則表達式。
"|"符號在擴展的正則表達式中表示"或"意義,遺憾的是,"|"符號的這種用法卻不多被人記住,"|"符號最著名的是其管道符用法。