shell程式設計之正規表示式

2021-07-10 16:44:46 字數 1718 閱讀 1235

1、正規表示式

其實就是一種規範,也就是模式,約束字串等符合什麼樣的格式,比如要求字串必須a開頭,t結尾,符合這樣條件的字串就要用到正規表示式。

2、兩套庫

gnu/linux中有有兩套庫用足正規表示式程式設計,posix庫,自帶的;pcre庫,perl,功能比較全,本文採用perl。

3、初體驗

$egrep ""^a.*t$" /usr/share/dict/words  表示從words檔案中查詢以a開頭,t結尾的單詞。

$egrep ""^a.*t$" /usr/share/dict/words | wc -c  統計得到單詞的數量。

4、字符集和單詞

「.」用於匹配除了換行符之外的任意乙個字元,.at就能匹配cat、#at、&at……

[a-z]at:限定只能是小寫字母

[abc]at:只能是a或者b或者c

[a-za-z]at.匹配所有的英文本母,[0-9]匹配0到9的數字。

說明:"[a-z]at":只要含有[a-z]at都匹配,例如cat、a#$bat\@!bat$@$等,要想只限制cat這樣的,要加單詞約束/<[a-z]at/>.

linux中,「單詞」是指兩側由非單詞字元分割的字串。

非單詞字元是指除了字母、數字、下劃線以外的任何字元。

5、字元類的概念

$egrep "[[:upper:]]t$" words,匹配大寫字母開頭,小寫字母t結尾的字元換。諸如[[:uper:]]又很多,小寫字母等等。

6、位置匹配

「^」行首、「$」行尾

例:^a[a-z]t$:以字母a開頭。t結尾,中間包含乙個小寫字母的單詞。

7、字元轉義\

這個和c、c++等語言中的轉義字元概念一致,就是比如你想輸進去「.」,可是「.」表示除換行符外的任何字元,那麼可以使用「\.」就表示其本身了。

8、重複

「*」表示任意數量的重複

「+」表示重複至少1次

「?」表示重複0或1次

「」表示重複3次,「」表示重複至少n次,至多m次;「」表示重複至少n次,沒上限。

9、子表示式

也稱為「分組」,說的更直白一點就是,一坨字串看成乙個整體,用括號括起來(),整體出現。

例:「(my)&t」就表示以t結尾,my出現兩次的字串。這時候my是乙個整體。mymyt等將被匹配。

10、反義

就是取原來的匹配相反的匹配。整體取反。

[^y]:除了y字元都能匹配。[6aoeiu]:除了aooeiu所有的字元。

注意:^[^y]表示行首不為y,^在表示行首和反義時在位置上的區別。

11、分支

^ht$:行首為h,行尾為t,表示並且。

^h|t$:行首為h,或者行尾為t,表示或。

例子:jan(uary| |\.):匹配january或january或者jan.

12、逆向引用

子表示式(分組)中捕獲的內容可以在正規表示式的其他地方再次使用,使用者可用反斜槓「\」加自表示式上標號來指代該分組匹配到的內容。

(\<.*\>).?()*\1:其中\1前面的(\<.*\>),表示匹配任意長度檔次的第乙個表示式

從左到右第乙個出現的自表示式為1、第二個為2……

……當然,正規表示式的匹配是門大學問,通常我們只能寫出簡單的,具體的應用還要自己寫出一些更為複雜的正規表示式,並且正規表示式的編寫極為容易出錯,主要是考慮不全。

大家也可以參考如下這篇文章,寫的很贊,很適合入門,簡單應用:正規表示式30分鐘入門教程

Shell程式設計之正規表示式

1.萬用字元 2.正規表示式與萬用字元元字元作用 前乙個字元匹配0次或任意多次 匹配除了換行符外任意乙個字元 匹配行首。例如 hello會匹配以hello開頭的行 匹配行尾。例如 hello 會匹配以hello結尾的行 匹配中括號中指定的任意乙個字元,只匹配乙個字元 匹配除中括號的字元意外的任意乙個...

Shell程式設計之正規表示式

目錄 正規表示式 概述 基礎正規表示式 前乙個字元匹配 0 次,或任意多次 匹配除了換行符外任意乙個字元 匹配行首,匹配行尾 匹配中括號中指定的任意乙個字元,只匹配乙個字元 匹配除中括號的字元以外的任意乙個字元 轉義符 表示其前面的字元恰好出現 n 次 表示其前面的字元出現不小於 n 次 匹配其前面...

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

正規表示式 regular expression 是一種文字模式,描述了一種字串匹配模式。可以用來檢查乙個串是否包含有某種子串。在linux的shell程式設計中廣泛運用。正規表示式分為兩類 基本正規表示式 basic regular expression bre和擴充套件正規表示式 extende...