大有可爲的“正則表達式”(一)

5.1.  正則表達式概述

正則表達式(regular expression),可簡寫爲regexre,是一種指定字符串模式的簡潔方式。常用於字符串的搜索與替換操作。

例如,下面的一組字符串,作爲正則表達式,可以使用xiao[123]表示:

xiao1   xiao2    xiao3

很多UNIX工具都使用正則表達式來強化其自身的功能,例如:

1)查找匹配文本的grep家族(grep/egrep/agrep

2)大名鼎鼎的流編輯器sed

3)字符串程序處理語言awkperl

4)文本查看程序,例如moreless

5)文本編輯器,例如viemacsjed

5.2.  正則表達式使用語法

正則表達式的強大來自擁有特殊含義的元字符(metacharacter)和縮寫的使用。

5.2.1.  特殊含義的元字符

.          除新行(如換行)字符外,匹配任意的單個字符

^                錨:匹配行的開頭

$                錨:匹配行的末尾

\<               錨:匹配單詞的開頭

\>               錨:匹配單詞的末尾

[list]          字符類:匹配list列表中的任字符

[^list]        字符類:匹配不在list列表中的任何字符

       分組:視爲一個單獨的單元

|                 交替:匹配選擇之一,爲ERE運算符裏優先級最低

\                 引用:從字面上解釋元字符,通常用以關閉後續字符的特殊含義。

*           匹配在它之前的任何數目(或沒有)的單個字符

1錨(anchor), 用來匹配在字符串的開頭或末尾的位置。

2:分組,由於()--圓括號提供分組功能,讓運算符可以被應用到“前置的正則表達式”,如(xiao+表示匹配於一個或連續重複的多個xiao

     分組可以一民交替結合構建複雜且靈活的正則表達式。如[Aa]pple computer|tv is 表示在Apple(或apple)與is之間,包含有computertv的句子。

3

5.2.2.  重複運算符

*                匹配0次或多次

+                匹配1次或多次

?                匹配0次或1

{n}              匹配n

{n,}            最少匹配n

{0,m}         最多匹配m

{,m}           最多匹配m

{n,m}         區間表達式,最少匹配n次,最多匹配m

 

舉例:

A \ { 2 \ }B_____A至少出現2次,AAB

A \ { 4\ }B_____ A最少出現4次,如AAAABAAAAAB

A \ { 24\ }B_____A出現次數範圍2-4次,如AABAAABAAAAB

 

備註:

1)?和 + 適用於擴展正則表達式。

我們可以把?想成是“可選用的”,也就是匹配前置正則表達式的文本,要麼出現,要麼沒出現。舉例看,與bce匹配的有bebce,就這兩個!

+字符在概念上 *元字符類似,不過匹配前置正則表達式要匹配的文本在這裏至少得出現一次,舉例看,ab+c匹配於abcabbcabbbc,但不會匹配於ac

2)正則表達式中的“*”與Shell中的“*”是不同的

Shell中的“*”表示任意個字符,正則表達式中的“* 匹配0次或多次某個字符。

舉例:1aa*,在正則表達式中,第一個a後面跟上0個或多個a

      2)搜索k開頭和結尾,中間是至少一個i的字符串,即kik, kiikkiiik...

grep  'kii*k' test.txt

 

5.2.3.  預定義字符類(方括號表達式)

[:lower:]            小寫字母(類似於:a-z

[:upper:]            大寫字母(類似於:A-Z

[:alpha:]            大小寫字母(類似於:A-Za-z

[:alnum:]           大小寫字母、數字(A-Za-z0-9

[:digit:]              數字(類似於:0-9

[:punct:]            標點符號

[:blank:]             空格或製表符(空白符)

[:cntrl:]              控制字符

[:graph:]            非空格字符

[:space:]            空白字符

 

注:方括號是名稱的一部分

 

例:grep   ‘21[[:alpha:]]’ data

查找文件data中包含數字21後面跟一個小寫字母或大寫字母的所有行

grep  ‘[[:upper:]][[:upper:]][[:digit:][[:lower:]]’  data

查找包含兩個連續大寫字母,後面跟一個數字,再跟一個小寫字母的所有行

grep  ‘X[0-9][0-9]’   data = grep  ‘X[[:digit:]][[:digit:]]’  data

 

匹配不在特定字符類之中的字符,爲此,只需在開頭的左方括號之後放一個^,可以使用^(充當一個操作否定符)

grep  ‘Y[^ak]’  data

查找包含字母Y,同時後面不跟有ak的所有行

 

提示:每個字符類——不管他看上去有多麼複雜(只表示一個單獨的字符)

請關注 大有可爲的“正則表達式”(二)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章