正則表達式(regular expression),可簡寫爲regex或re,是一種指定字符串模式的簡潔方式。經常使用於字符串的搜索與替換操做。
例如,下面的一組字符串,做爲正則表達式,可使用xiao[123]表示:
xiao1 xiao2 xiao3
不少UNIX工具都使用正則表達式來強化其自身的功能,例如:
(1)查找匹配文本的grep家族(grep/egrep/agrep)
(2)大名鼎鼎的流編輯器sed
(3)字符串程序處理語言awk、perl等
(4)文本查看程序,例如more、less等
(5)文本編輯器,例如vi、emacs、jed等
正則表達式的強大來自擁有特殊含義的元字符(metacharacter)和縮寫的使用。
. 除新行(如換行)字符外,匹配任意的單個字符
^ 錨:匹配行的開頭
$ 錨:匹配行的末尾
\< 錨:匹配單詞的開頭
\> 錨:匹配單詞的末尾
[list] 字符類:匹配list列表中的任一字符
[^list] 字符類:匹配不在list列表中的任何字符
( ) 分組:視爲一個單獨的單元
| 交替:匹配選擇之一,爲ERE運算符裏優先級最低
\ 引用:從字面上解釋元字符,一般用以關閉後續字符的特殊含義。
* 匹配在它以前的任何數目(或沒有)的單個字符
注1:錨(anchor), 用來匹配在字符串的開頭或末尾的位置。
注2:分組,因爲()--圓括號提供分組功能,讓運算符能夠被應用到「前置的正則表達式」,如(xiao)+表示匹配於一個或連續重複的多個xiao
分組能夠一民交替結合構建複雜且靈活的正則表達式。如[Aa]pple (computer|tv) is 表示在Apple(或apple)與is之間,包含有computer或tv的句子。
注3:
* 匹配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次,如AAAAB,AAAAAB…
A \ { 2,4\ }B_____A出現次數範圍2-4次,如AAB,AAAB,AAAAB
備註:
(1)?和 + 適用於擴展正則表達式。
咱們能夠把?想成是「可選用的」,也就是匹配前置正則表達式的文本,要麼出現,要麼沒出現。舉例看,與bc?e匹配的有be與bce,就這兩個!
+字符在概念上 與*元字符相似,不過匹配前置正則表達式要匹配的文本在這裏至少得出現一次,舉例看,ab+c匹配於abc、abbc、abbbc,但不會匹配於ac。
(2)正則表達式中的「*」與Shell中的「*」是不一樣的 。
Shell中的「*」表示任意個字符,正則表達式中的「*」 匹配0次或屢次某個字符。
舉例:1)aa*,在正則表達式中,第一個a後面跟上0個或多個a
2)搜索k開頭和結尾,中間是至少一個i的字符串,即kik, kiik、kiiik...等
grep 'kii*k' test.txt
[: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,同時後面不跟有a或k的全部行
提示:每一個字符類——無論他看上去有多麼複雜(只表示一個單獨的字符)
請關注 大有可爲的「正則表達式」(二)