1. 程式人生 > >檔案路徑 正則表示式

檔案路徑 正則表示式

今天為了寫一個很小的專案,為了使索引檔案系統具有跨平臺性,需要用java正則表示式過濾來自Windows的蹩腳的路徑名,我們知道,Windows 有一個很SB的檔案系統就是碟符,以至於企業N個T容量的伺服器尤其是磁碟陣列經常為碟符不夠用頭疼,這時不得不用Raid合併碟符,別以為raid只是 為了磁碟的冗餘備份!——當然,扯遠了。

現在進入正題,我在網上用google、baidu、bing等等等搜尋引擎查了好多資料,卻沒有一個符合我的要求,大多數是http格式過濾,少部分是 unix like的過濾,還有一部分是微軟平臺的正則,他們平臺的正則不具有跨平臺性!我承認,不同語言的正則在設計時是有少許符號不同的,Java這門語言的正 則是借鑑了Perl 5的正則。 無奈了,既然大家都沒有跨平臺的正則,那麼好吧,老子自己寫,一步一步除錯測試,不求你們了! 經過了兩個小時的設計,我的跨平臺版正則新鮮出爐!可貴的是,考慮到大家都是中國人嘛,我的正則任何語言通吃,你要輸入中文路徑名和檔名都行,當然如果 你輸入鳥語,比如日文、韓文、阿拉伯文(?不知道有沒有)外星文字(只要你係統能顯示的),別以為很短,有本事你們自己設計一個符合跨平臺的檔案路徑正 則,
正則如下:

(^//.|^/|^[a-zA-Z])?:?/.+(/$)?



我來解釋一下:
開頭匹配 “.”(當前路徑,“/”後邊有匹配) “/”(unix like絕對路徑名) a-zA-Z(碟符)匹配一個字母
中間匹配 “:”0個或1個
後邊匹配 “/.”/後邊的任意字元
最後匹配 “/” $代表了終結符,0個或1個,如果你輸入了“/”就代表你輸入了一個目錄,如果不輸入“/”那你File(path).isDirectory()自己判斷是否是目錄去吧 !

警告: 雖然後邊匹配是匹配的任意字元,但由於windows和unix對檔案命名都是有相應規範的,這裡沒列入匹配規則,我想一般也不會有人把檔名起的特別怪異吧!當然,等我把這個小專案忙完了自己再查查這兩套系統的檔案命名規範,修正這個正則的小漏洞

當然,我有必要把不分程式碼公佈,以便有用的人可以先過濾使用者輸入的字串,然後進行細化處理!
//code

public File filePathPreProc(String pathstr){
        pathstr=pathstr.replaceAll("////", "/").trim();
        System.out.println(pathstr);
        java.util.regex.Pattern p=java.util.regex.Pattern.compile("(^//.|^/|^[a-zA-Z])?:?/.+(/$)?");
        java.util.regex.Matcher m=p.matcher(pathstr);
        //不符合要求直接返回
        if(!m.matches()){
            return null;
        }
        //這裡開始檔名已經符合要求
        File path=new File(pathstr);
            //TODO:寫自己的程式碼
        return path;
    }

這個函式是檔案路徑預處理函式,把使用者輸入的類似E://aaa//bbb ccc//cccc_ddd//alkf.xxx 或路徑直接轉為unix like檔案路徑格式,如果失敗,返回空值(null)如果成功了,返回File物件。