2012-04-25 97 views
5

我需要在這種方法中驗證一個。用於驗證文件名的正則表達式

validateFileName(Editable s) { 
     String filtered_str = s.toString(); 
     if (filtered_str.matches(".*[regexp].*")) { 
      filtered_str = filtered_str.replaceAll("[regxp]", ""); 
      s.clear(); 
      s.append(filtered_str);} 

我應該使用哪個正則表達式來排除所有非法字符和空格?我使用Linux

+3

在上的Unix文件系統的文件名,唯一非法字符是'/'(路徑分隔)和'\ 0'(串的用C端)。 – geekosaur 2012-04-25 21:42:16

回答

4

如果你的想法是隻排除ilegal和空間字符,你可以使用類似:

'^[^*&%\s]+$'

,您可以添加任何「ilegal」焦炭引入字符的列表(在這種情況下它忽略*,&,%和空格)\s是空格! []裏面的^是它表示的正則表達式語法的一部分:do 不是匹配[]內的任何字符。

9

如果您使用的是POSIX兼容操作系統,則文件名中的合法字符爲a-z,A-Z,0-9,句點,下劃線和連字符。正則表達式匹配「非法」字符將因此

[^-_.A-Za-z0-9]

附錄:這是,如果你想有一個完全可移植的文件名。正如我在下面的Josip的評論中糾正的,POSIX本身實際上允許更多的字符。

+0

這似乎是不正確的,因爲http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html只是說「構成名字節不得含有字符」。在3.170文件名。 – 2015-09-17 10:02:37

+0

啊,是的。我應該在我的回答中澄清,如果你想要一個完全可移植的**文件名,你可以使用我描述的正則表達式。這來自於由Donald Lewine(1991)撰寫的書_POSIX Programmer's Guide:Writing Portable UNIX Programs_第63-64頁。 – Anachronist 2015-09-18 00:57:35

+0

這仍然是非常嚴格的,這對1991年來說是可以理解的,但是現在並不是這樣。文件名中的逗號和空格在用戶中非常普遍。他們可能會抱怨,如果你申請這個,並且遵守80年代的限制不一定被認爲是合理的理由。 – 2015-09-18 08:31:56