正規表示式 - 文本搜尋利器

正規表示式是什麼!?

網路上有很多文章都說得很清楚了,
推薦大家閱讀這篇:文本分析基礎-正規表達式(RegExp)
內容很清晰易懂,深入淺出。
初學者可搭配使用線上使用測試網站,直接練習正規表示式,會學得更快喔!
測試網址:https://regex101.com/

案例1:LogParser
原本程式在解析log檔內容,常用關鍵字的方式來判所是否有異常發生
例如我們抓取log有出現error的字眼,就判定這是有異常的情況!
而這個關鍵字的抓取方法就是採正規表示式,設定內容如下
.*error.*
但最近遇到一個問題,就是log中輸出了處理的檔案名稱的資訊,
當檔案名稱帶有error的字眼時,系統就誤判異常而發出了告警。
為了改善這個問題,可以調整正規表示式來下手。

首先要厘清檔名中的error通常以什麼型態存在,大致有兩種型式

  1. 存在於副檔名,例如Afile.txt.error
  2. 附加在檔名之後,例如Bfile_error.txt
所以,搜尋規則變成抓取error字眼,但要排除掉error之前有 . 或 _ 的這種情況。
調整後的正規表示式如下
^[^\._]*error.*$
分幾個部分說明這個表示式的功能

  1. 原本的error就是想抓取的關鍵字
  2. 後面的.*$為任意字元結尾都可以,也可以在error之後就無字元
  3. [^\._]*,表示非 . 或 _ 的字元出現0~多次,然後前面再加個^表示要從開頭開始抓取
後來又想到,如果一行訊息裡有error檔名,但又同時出現了error的錯誤字眼,這種錯誤就會被忽略掉,例如:Afile.error.txt delete error.
因此再次調整如下
\s[^\._]*error.*$
將^換成\s,變成從空格或換行開始抓,不過這個pattern的問題是無法抓下整行的訊息
後續再看有什麼更好的解法吧!



留言

這個網誌中的熱門文章