標籤:
一些無稽之談:
對於Regex,永遠似瞭解不明白,看到一些代碼,指令碼定期,awk,sed。心裡總有點虛。主要是記不住。平時又沒怎麼用,也就沒總結了。
如今有空,決定總結一下,順便克服一下看到shell,js這些帶有正則就心虛的弱點。
打算分三篇文章來寫
本文:
一般來說,正則分好幾種。但基本都差點兒相同,我所瞭解的有 “基本正則”,“擴充正則“及”perl正則”,本文更偏向說記錄“基本正則”和“擴充正則”,它們在grep,egrep,sed,awk中發揮著重要發作用。
開始正則前,先複習一下grep的一些經常使用參數:
-n ,顯示行號。-v, 反向選擇-i,忽略大寫和小寫
以下來始抄書了,參考《鳥哥的Linux私房菜.基礎學習篇 》。先下載我們要用的文本:
http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt
內容例如以下:
先來學習”基本正則表達式“
1.直接匹配
例1.分別找出含apple和is 的文本
這應該是最簡單的使用正則了
2.方括弧[]
[]主要是進行集合方面的匹配。使用方法我們還是用範例說明
例2匹配含有test,tast的文本
能夠看出。[]就是從集合[ae]中選出一個一個來匹配
3.方括弧[]與中橫線-結合
對於想匹配含有一個數位文本,我們能夠寫成[0123456789],但這樣難免太麻煩,這就須要中橫線了對於數字,能夠寫成[0-9], 相同,對於字母也能夠應用上來,大寫字母[A-Z],小寫字母[a-z],也能夠合在一塊。如大寫和小寫字母[a-zA-Z].
例3,找出含有數位文本
4.方括弧[] ,-,^,三者結合
在[]中出現^表示取反,舉例說明
例4.取出帶有oo。但oo前不含g的文本
最後一個”19:goooooogle yes!”為什麼會匹配上呢?儘管前面是goo,明顯不滿足。可是。 go(oo)oogle,是滿足的,所以匹配上了。這也許就是正則的痛點之中的一個,你寫出的正則也許存在bug,但你還沒發現。
例5。 匹配帶有oo,的文本。但oo前不含小寫字母
看到了吧,這就是[],-,^共同使用,注意:^在[]內才表示取反。
5.^與$
這裡又出現了^,但與上面的不一樣。這裡的^表示行首,對應的$就表示行尾。
例6 取出以the 開頭的文本
例7 取出以數字或字母結尾的文本
例8取出空行
空行用’^$’進行匹配
6.點號. 與星號*
點號.表示有且僅有一個隨意字元
星號表示反覆前一個0個或多個字元
例9匹配形如g??d的字串(gd之間有兩個字元)
如結果所看到的。點號.是表示一個隨意字元。
例10 匹配至少連續兩個o以上的字元。
注意到這裡。”*”的意義與我們所認識的萬用字元*是不一樣的。
例11匹配g開頭g結尾的文本
用’g*g’ 是不行的。由於*和萬用字元是不一樣,正確的是’g.*g’
所以,記住,正則表達式的*和萬用字元的 *不一樣!
7.轉義\
假設我們想匹配的文本正好是代表一些特殊字元(《鳥哥的linux私房菜》中說是在shell中有特殊函義,我覺得是不對的,或者說讓人誤解,僅僅是 shell中的嗎?比方他舉的範例點號,在shell中代表的是本檔案夾吧?事實上真正的原因是.是正則表達字元吧?),該怎樣?轉義。
如匹配以點號 . 結尾的文本。我們知道.在正則表達式中表示匹配且僅匹配隨意一個字元,所以能夠用’\.$’
今天就先寫到主要的正則表達式吧。
參考資料:
《鳥哥的Linux私房菜》
《Linux程式設計》
http://www.ibm.com/developerworks/cn/education/aix/au-unixtips3/
http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html
著作權聲明:本文博主原創文章,部落格,未經同意不得轉載。
使用方便 Regexgrep,sed,awk(一)