Shell程式設計之正規表示式總結

2021-07-09 19:25:53 字數 4065 閱讀 4391

正規表示式(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 次 匹配其前面...