這次學 Regular Expression 我是看朝陽科技大學洪朝貴教授的講義:一輩子受用的Regular Expressions:兼談另類的電腦學習態度,非常值得反復研讀(會用到Linux & Perl),特別是講義裡面連到的另一篇文章:如何有效學習電腦 (Aug 2001 重新整理),更是值得細讀、好好思考。以下節錄幾段我覺得寫的很棒的:
學習高組合性軟體還有另外一個優點。 資訊科技進步迅速, 而資訊市場更是變化驚人, 我們很難預測那些軟硬體未來會有較佳的就業市場。 學一套多功能聚集於一身但與他人溝通不良的「萬能」軟體, 就像是把所有的雞蛋放在同一個籃子裡一樣危險。
附帶而來的好處, 就是 學習組合軟體, 知識的壽命長, 經驗可以累積。
能夠拿來與其他知識組合運用的知識, 才是投資報酬率高, 生命週期長的知識。 眼光放遠, 慎選所學軟體, 培養組合能力, 讓你的新知識與舊知識發揮相乘的效果, 讓生產力曲線成指數成長! (感謝 GNU 文件的啟發, 本文觀念來自 info -f textutils "Opening the software toolbox" 一節; 也請參考我的 linux 講義當中 「組合的力量」 當中的具體操作實例.)
另外舉一個例子,最近在黑暗大的blog看到一篇:MEMO- 用Javascript RegExp將<x>置換成<span class='x'>,也是一個很實用的例子,在 coding 時當然可以依賴 IDE 提供的搜尋/取代功能,但如果利用程式直接修改 memory 的資料,或者要處理從DB中撈出來的資料,最省時省力的方法還是 RegExp!
(附帶一提,如果只是要把 <c> 換成 <span>, 程式只要以下兩行即可:
var regex = /[<](\/?)c\d>/g;
s = s.replace(regex, "<$1span>");
不用拆成兩段!就算用IDE的搜尋/取代功能也無法一次到位阿!)
ok, 以上的
通常學 RegExp 都在探討怎樣從一堆資料中找出「符合」樣式的字串,很少有資料講到如何顯示「不符合」樣式的資料!但是有時候其實很多資料都是雜訊(例如information log),沒有先過濾掉的話,很容易漏掉真正重要的資料,那麼要怎樣把「符合」樣式的資料過濾掉呢?
經過一段時間的摸索,我發現在 Linux / Unix 裡面,有個非常好用的 shell command: grep,只要加上 -v 這個 switch 就可以達到這樣的效果!-v 的作用如下:
-v, --invert match
Invert the sense of matching, to select non-matching lines.
所以我只要下這個command,就可以過濾掉含有「cat」的資料了:
cat /var/log/messages | grep –v cat
接下來的問題是,如果要過濾多個條件怎麼辦?例如我要過濾掉「有出現 cat 或 dog 或 bat 的資料」,要怎麼做呢?最直覺的想法就是利用 pipe (管線命令) 的功能,一層一層的過濾,指令大概會長的像下面這樣:
cat /var/log/messages | grep –v cat | grep –v dog | grep –v bat
這樣的命令當然很好懂,但同時也很冗長!
再經過一陣摸索之後,我發現可以用 egrep 來解決這個問題,如正規表示式的入門與應用(三)文中所說的 (這篇文章是在 Google 搜尋「egrep」的第一名),利用 egrep 所支援的「|」(邏輯 or) 關鍵字可將指令簡化,簡化後的指令如下:
cat /var/log/messages | egrep –v ‘cat|dog|bat’
這樣是不是簡潔很多呢!要特別注意的是,「|」的前後不能多出空白,否則那些條件會僅剩下最後一個有效喔!(不要加上 -v 的話就是直接列出有 cat 或有 dog 或有 bat 的資料)
以上是 Regular Expression 的好文推薦 + grep / egrep 實例演練,之後會持續整理實務上有應用到的 Regexp 實例,敬請拭目以待 :D
沒有留言:
張貼留言