1. 程式人生 > >Android java用正則方法驗證檔名是否合法

Android java用正則方法驗證檔名是否合法

Java中用到檔案操作時,經常要驗證檔名是否合法. 用File類的createNewFile()方法的確很管用.但當要批量驗證時,效率上就會有問題.正則匹配的開銷比建立檔案少了很多. 那麼一個合法的檔案(Win下)應該符合如下規則: 

1.檔名不能為空,空在這裡有兩個意思: 

  1. 檔名(包括副檔名)長度為0或僅由空字元組成(包括\t\b等不可見的轉義字元)
  2. 檔名和副檔名不能同時為空.但實際上我們可以用程式創建出類似.project,..txt等形式的檔案,但卻建立不出類似abc.的檔案 

2.檔名中不能包含\/:*?"<>|中的任意字元 

3.檔名(包括副檔名)的長度不得大於255個字元 事實上形如".."(不包含引號,下同)的檔案也不能被建立. 不合法的檔案還有類似" aa", "aa ", "aa."(會被建立為"aa",也把它算作不合法),"a\ta"(\t為製表符等不可見字元(除空格外)) 

於是我們得到了檔名命名規則的更詳細規定: 

1.首尾不能有空字元(空格、製表符、換頁符等空白字元的其中任意一個),檔名尾不能為.號

2.檔名和副檔名不能同時為空 

3.檔名中不能包含\/:*?"<>|中的任意字元 

4.檔名(包括副檔名)的長度不得大於255個字元 

5.在1.的條件下,檔名中不能出出現除空格符外的任意空字元.

出現控制字元其實也算不合法,但因為情況太複雜,就不做判斷了。 於是有如下匹配 首字元: [^\s\\/:\*\?\"<>\|]尾字元: [^\s\\/:\*\?\"<>\|\.]其它字元: (\x20|[^\s\\/:\*\?\"<>\|])* \s 只能匹配下面六種字元(via: java.util.regex.Pattern): 半形空格( ) 水平製表符(\t) 豎直製表符 回車(\r) 換行(\n) 換頁符(\f) 

用Java語言實現: 

public static boolean isValidFileName(String fileName) { if (fileName == null || fileName.length() > 255) return false; else return fileName.matches("[^\\s\\\\/:\\*\\?\\\"<>\\|](\\x20|[^\\s\\\\/:\\*\\?\\\"<>\\|])*[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]$"); }