正規表示式(regular expression)是一種文字模式,描述了一種字串匹配模式。可以用來檢查乙個串是否包含有某種子串。在linux的shell程式設計中廣泛運用。正規表示式分為兩類:基本正規表示式(basic regular expression)bre和擴充套件正規表示式(extendedregular expression)。
在windows/dos下,如果我們要查詢所有的以.doc結尾的檔案,我們通常會用萬用字元*.doc,在這裡*會被解釋成任意長度的任意字串。這也可以說是一種匹配模式。和萬用字元類似,正規表示式就是用來進行文字匹配的工具,只不過比起萬用字元,正規表示式能更精確的描述你的需求。但是,這也是需要付出更大的代價——更複雜。
從根本上來看,正規表示式是由兩個基本組成部分建立:一般字元和特殊字元。一般字元是指任何沒有特殊意義的的字元。特殊字元稱為元字元(mete character)。
先來看一些簡單的匹配:
metechar :匹配一行上任意位置的8個字母 metechar
^metechar :以metechar開頭的行
metechar$ :以metechar結尾的行
[mm]etechar :匹配一行上任意位置的metechar或者metechar
met.char :匹配一行上任意位置包含有,met加上任意乙個字元後面再接上char的,即met+單個字元+char,例如metechar,metachar……都是滿足的。
met.*char :匹配一行上任意位置包含有,met加上任意個字元(0個或者n個)後面再接上char的,metammmchar,metachar,metabcdchar都是可以的。
一、基本正規表示式
習慣上的把元字元大致分為如下幾類:
1.用於匹配單個字元的元字元:
.: 匹配任意的單個字元
: 匹配指定範圍內的任意的單個字元
擴充套件:有時候寫要匹配0到9之間的數字,可以這樣寫[0123456789],然而這樣寫太麻煩了,我們習慣上使用[0-9],同理a到g之間的字母[a-g],a到z之間的字母[a-z]。
[^]: 匹配指定範圍外的任意的單個字元
擴充套件:字元集合:
[:digit:] 匹配數字
[:lower:] 匹配小寫字母
[:upper:] 匹配大寫字母
[:space:] 匹配空格
[:alpha:] 匹配大寫字母和小寫字母
[:alnum:] 匹配大、小寫字母和數字
例:有如下字元:
abc,abb,abdc,a123b,a1b,aab,adfghb,abcd,abcabcabcabc,abcdcdcdab
a.b: abb
a*b:abc,abb,abdc,a123b,adfghb,abcd,abcabcabcabc,abcdcdcdab
a[[:digit:]]b:a1b
2.用於匹配次數的元字元
*: 匹配其前面的字元任意次(包括0次)
擴充套件: .*: 任意長度的任意字元
\?: 匹配其前面的字元1次或0次 注:」\」用作轉義 !!!其前面的字元可有可無
\ :匹配其前面的字元n次
\:匹配其前面的字元至少m次,至多n次
擴充套件:\ :匹配其前面的字元至少m次
例:有如下字元:abc,abb,a1b,aab,abdc,a123b,aabb,adfghb,abcd,abcabcabcabc,abcdcdcdab,accb,accc,ac,accg
a.*b: abc,abb,a1b,aab,abdc,a123b,aabb,adfghb,abcd,abcabcabcabc,abcdcdcdab,accb
a\?b: abc,abb,a1b,aab,abdc,a123b,aabb,adfghb,abcd,abcabcabcabc,abcdcdcdab,accb
a\b:aabb
ac\:accb,accc,ac,accg
3.用於位置錨定的元字元:
^: 錨定行首,此字元後面的任意內容必須出現在行首
$: 錨定行尾,此字元前面的任意內容必須出現在行尾
^$: 空白行
\《或\b: 錨定詞首,其後面的任意字元必須作為單詞首部出現
\>或\b: 錨定詞尾,其前面的任意字元必須作為單詞的尾部出現
例:有乙個檔案內容如下
------test.file------------
hello,every one!
this is a test file.
the next line is blank line!
he is her lover
she is his liker
the test file end!
--------end----------------
^t:以 t 開頭的行
this is a test file.
the next line is blankline!
the test file end!
\.$:以 . 結束的行
thisis a test file.
<\bl:包含有以 bl 開頭的單詞的行
thenext line is blank line!
ne\>:包含有以 ne 結尾的單詞的行
hello,every one!
the next line is blank line!
<\l.*r\>:包含有以 l 開頭且以r結尾的行
he is herlover
she is his liker
分組:
前面只提到了怎麼重複單個字元(直接在後面加上限定符就好了);但是如果想要重複多個字串怎麼解決?這就要用到我們分組的概念了,用小括號來指定表示式,再來指定重複的次數。
例:ab* 表示 b可以出現任意次
\(ab\)* 表示ab可以出現任意次
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.)(2[0-4]\d|25[0-5]|[01]?\d\d?)
後向引用:
使用小括號指定乙個子表示式後,匹配這個子表示式的文字(也就是分組捕獲的內容)可以在表示式中或其他程式中進一步的處理。預設情況,每個分組預設擁有乙個組號。規則是:從左到右,以分組的左括號為標誌,第乙個出現的分組為1,用\1引用,第二個為2,用\2 引用,以此類推。
\1:引用第乙個左括號以及與之對應的右括號所包括的所有內容
\2:引用第二個左括號以及與之對應的右括號所包括的所有內容
\3:以此類推……
二、擴充套件正規表示式
擴充套件正規表示式基本用法與基本正規表示式基本一樣,元字元不需要轉義
1.用於匹配單個字元的元字元:
.: 匹配任意的單個字元
: 匹配指定範圍內的任意的單個字元
擴充套件:有時候寫要匹配0到9之間的數字,可以這樣寫[0123456789],然而這樣寫太麻煩了,我們習慣上使用[0-9],同理a到g之間的字母[a-g],a到z之間的字母[a-z]。
[^]: 匹配指定範圍外的任意的單個字元
2.用於匹配次數的元字元
*: 匹配其前面的字元任意次(包括0次)
擴充套件: .*: 任意長度的任意字元
?: 匹配其前面的字元1次或0次
:匹配其前面的字元n次
:匹配其前面的字元至少m次,至多n次
擴充套件: :匹配其前面的字元至少m次
3.用於位置錨定的元字元:
^: 錨定行首,此字元後面的任意內容必須出現在行首
$: 錨定行尾,此字元前面的任意內容必須出現在行尾
^$: 空白行
\《或\b: 錨定詞首,其後面的任意字元必須作為單詞首部出現
\>或\b: 錨定詞尾,其前面的任意字元必須作為單詞的尾部出現
分組:
shell程式設計之正規表示式
1 正規表示式 其實就是一種規範,也就是模式,約束字串等符合什麼樣的格式,比如要求字串必須a開頭,t結尾,符合這樣條件的字串就要用到正規表示式。2 兩套庫 gnu linux中有有兩套庫用足正規表示式程式設計,posix庫,自帶的 pcre庫,perl,功能比較全,本文採用perl。3 初體驗 eg...
Shell程式設計之正規表示式
1.萬用字元 2.正規表示式與萬用字元元字元作用 前乙個字元匹配0次或任意多次 匹配除了換行符外任意乙個字元 匹配行首。例如 hello會匹配以hello開頭的行 匹配行尾。例如 hello 會匹配以hello結尾的行 匹配中括號中指定的任意乙個字元,只匹配乙個字元 匹配除中括號的字元意外的任意乙個...
Shell程式設計之正規表示式
目錄 正規表示式 概述 基礎正規表示式 前乙個字元匹配 0 次,或任意多次 匹配除了換行符外任意乙個字元 匹配行首,匹配行尾 匹配中括號中指定的任意乙個字元,只匹配乙個字元 匹配除中括號的字元以外的任意乙個字元 轉義符 表示其前面的字元恰好出現 n 次 表示其前面的字元出現不小於 n 次 匹配其前面...