檔案路徑 正則表示式
今天為了寫一個很小的專案,為了使索引檔案系統具有跨平臺性,需要用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物件。