2013-01-03

使用Regular Expression過濾檔名

以往想要從一堆檔案清單中過濾特定規則的檔名,比較直覺的想法,可能是這樣:
  • 檔名大小寫問題
    要做不分大小寫的比對,或是統一轉大寫或小寫...
    Sring.ToUpper()/ToLower()/Compare()
  • 以特定字串起始、結束、或包含該字串
    可能會用到String.StartsWith()/EndsWith()/Contains()...
  • 以特定符號分隔
    如:底線。
    可能會用到String.Split()
  • 必須包含數字
    如:版本號。
    取檔名的第n位到第m位,並TryParse為Integer...
做完這些Parse之後,程式又臭又長,還得夾雜幾個 if...then...else,對於日後想修改過濾的檔名規則也不容易。

但透過使用「正規表示式」(Regular Expression)的話,這件事就變得簡單很多。

以預想的目標,想在一堆的檔名清單中,找到:「以"ken_"開頭,緊接著2位數字的txt檔」

程式只要使用Regex的Pattern為:"^ken_\d{2}.txt"

由於檔名通常是不區分大小寫(case-insensitive),所以在字串比對的時候,也要注意,判斷時加上 RegexOptions.IgnoreCase 的設定就搞定了!!


//要被過濾的檔案清單
string[] filelist= { 
      "abc_abc.txt",
      "kenlai_01.txt",
      "ken_88.txt",
      "DEF.exe",
      "ken_99.TXT"
};
//過濾規則
Regex searchPattern =
  new Regex("^ken_\d{2}.txt", RegexOptions.IgnoreCase);

//結果
var newlist = (from f in filelist 
              where searchPattern.IsMatch(f)
              select f);
return newlist;
// output: "ken_88.txt","ken_99.TXT"

是不是比寫一堆code簡單多了?
整個比對的程式碼,從至少10行濃縮到2行!!

以後要改搜尋的規則,也只要修改這個Pattern就好了!

誠如洪朝貴老師所說,Regular Expression 真是一種低成本, 高報酬的學習投資!


也不禁讚嘆 Regular Expression 這個歷久彌新的神物啊~~



延伸閱讀:

沒有留言:

張貼留言

引用 Topshelf 無法進行偵錯的經驗

Topshelf  是一個可以簡化撰寫 Windows Service 的套件,引用之後,我們只要當作撰寫一般 Console 的應用程式就可以。 只是近來撰寫上遇到無法進行Debug的狀況,在Visual Studio一進行偵錯可以看到Console 程式被執行,並顯示...