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...