大有可爲的「正則表達式」(一)

5.1.  正則表達式概述

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

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

xiao1   xiao2    xiao3 express

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

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

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

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

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

5)文本編輯器,例如viemacsjed spa

5.2.  正則表達式使用語法

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

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的全部行

 

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

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

相關文章
相關標籤/搜索