例題4、任意一個字元 . 與重複字元 *php
在第十章 bash 當中,我們知道萬用字元 * 能夠用來表明任意(0或多個)字元, 可是正規表示法並不是萬用字元,兩者之間是不相同的! 至於正規表示法當中的『 . 』則表明『絕對有一個任意字元』的意思!這兩個符號在正規表示法的意義以下:java
這樣講很差懂,我們直接作個練習吧!假設我須要找出 g??d 的字串,亦即共有四個字元, 起頭是 g 而結束是 d ,我能夠這樣作:bash
[dmtsai@study ~]$ grep -n 'g..d' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 9:Oh! The soup taste good. 16:The world <Happy> is the same with "glad".
因為強調 g 與 d 之間必定要存在兩個字元,所以,第 13 行的 god 與第 14 行的 gd 就不會被列出來啦!再來,若是我想要列出有 oo, ooo, oooo 等等的資料, 也就是說,至少要有兩個(含) o 以上,該如何是好?是 o* 還是 oo* 還是 ooo* 呢? 雖然你能夠試看看結果, 不過結果太佔版面了 @_ @ ,因此,我這裡就直接說明。app
因為 * 表明的是『重複 0 個或多個前面的 RE 字符』的意義, 所以,『o*』表明的是:『擁有空字元或一個 o 以上的字元』, 特別注意,因為允許空字元(就是有沒有字元均可以的意思),所以,『 grep -n 'o*' regular_express.txt 』將會把全部的資料都列印出來螢幕上!this
那若是是『oo*』呢?則第一個 o 確定必須要存在,第二個 o 則是可有可無的多個 o , 因此,凡是含有 o, oo, ooo, oooo 等等,均可以被列出來~google
同理,當我們須要『至少兩個 o 以上的字串』時,就須要 ooo* ,亦便是:spa
[dmtsai@study ~]$ grep -n 'ooo*' regular_express.txt1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food. 3:Football game is not use feet only. 9:Oh! The soup taste good. 18:google is the best tools for search keyword. 19:goooooogle yes!
這樣理解 * 的意義了嗎?好了,現在出個練習,若是我想要字串開頭與結尾都是 g,可是兩個 g 之間僅能存在至少一個 o ,亦便是 gog, goog, gooog.... 等等,那該如何?.net
[dmtsai@study ~]$ grep -n 'goo*g' regular_express.txt18:google is the best tools for search keyword. 19:goooooogle yes!
如此瞭解了嗎?再來一題,若是我想要找出 g 開頭與 g 結尾的字串,當中的字元可有可無,那該如何是好?是『g*g』嗎?
[dmtsai@study ~]$ grep -n 'g*g' regular_express.txt1:"Open Source" is a good mechanism to develop programs. 3:Football game is not use feet only. 9:Oh! The soup taste good. 13:Oh! My god! 14:The gd software is a library for drafting programs. 16:The world <Happy> is the same with "glad". 17:I like dog. 18:google is the best tools for search keyword. 19:goooooogle yes! 20:go! go! Let's go.
但測試的結果居然出現這麼多行?太詭異了吧?其實一點也不詭異,因為 g*g 裡面的 g* 表明『空字元或一個以上的 g』 在加上後面的 g ,所以,整個 RE 的內容就是 g, gg, ggg, gggg , 所以,只要該行當中擁有一個以上的 g 就符合所需了!
那該如何獲得我們的 g....g 的需求呢?呵呵!就利用任意一個字元『.』啊! 亦便是:『g.*g』的做法,因為 * 能夠是 0 或多個重複前面的字符,而 . 是任意字元,因此: 『.* 就表明零個或多個任意字元』的意思啦!
[dmtsai@study ~]$ grep -n 'g.*g' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 14:The gd software is a library for drafting programs. 18:google is the best tools for search keyword. 19:goooooogle yes! 20:go! go! Let's go.
因為是表明 g 開頭與 g 結尾,中間任意字元都可接受,因此,第 1, 14, 20 行是可接受的喔! 這個 .* 的 RE 表示任意字元是很常見的,但願你們能夠理解並且熟悉! 再出一題,若是我想要找出『任意數字』的行列呢?因為僅有數字,因此就成為:
[dmtsai@study ~]$ grep -n '[0-9][0-9]*' regular_express.txt 5:However, this dress is about $ 3183 dollars. 15:You are the best is mean you are the no. 1.
雖然使用 grep -n '[0-9]' regular_express.txt 也能夠獲得相同的結果, 但鳥哥但願你們能夠理解上面指令當中 RE 表示法的意義纔好!