2013-02-25 47 views
33

在Java中,我有一個文件名字符串。在那裏,我想,以取代「_」的所有非法字符,但不能a-z0-9-._替換文件名中的非法字符

我嘗試下面的代碼:但這並沒有工作!

myString = myString.replaceAll("[\\W][^\\.][^-][^_]", "_"); 
+2

由於標題更真實的問題,我對這個問題的解決方案是使用'filename = URLEncoder(fileName,」UTF-8「) '這個操作的結果總是一個有效的文件名,這也允許在文件名 – ApollonDigital 2015-09-26 13:33:27

+0

上使用'URLDecoder'獲得原始的文件名字符。沒有保證結果文件名總是有效的。*不是有效的字符。 – 2017-07-24 18:36:55

回答

70

您需要替換一切,但[a-zA-Z0-9.-]。 括號內的^代表「NOT」。

myString = myString.replaceAll("[^a-zA-Z0-9\\.\\-]", "_"); 
+0

是的,但後來刪除'。' '_'和' - ' 這個字符不應該被刪除! – bbholzbb 2013-02-25 20:32:10

+6

@bbholzbb我不這麼認爲。 – poitroae 2013-02-25 20:33:58

+1

是的,我看到:)謝謝! – bbholzbb 2013-02-25 21:10:41

11

保持簡單。

myString = myString.replaceAll("[^a-zA-Z0-9.-]", "_"); 

http://ideone.com/TINsr4

+0

我沒有downvote,但可能是因爲有更好的(?)解釋有類似的答案。 – nhahtdh 2013-02-25 20:57:39

+0

有沒有可以處理這個問題的任何Java API?由於進一步的兼容性問題。我的意思是這個手動替換可能會在除Windows之外的其他環境中產生一些錯誤。 – Max 2015-06-12 11:42:09

+2

@rajper不AFAIK。最簡單的事情就是確定你想要支持的所有平臺上的所有非法字符集,並全部替換它們。 – 2015-06-12 12:00:48

1

我知道有一直在這裏已經有一些答案,但我想指出的是,我不得不稍微改變給定的建議。

filename.matches("^.*[^a-zA-Z0-9._-].*$") 

這是我不得不使用Java中的.matches來獲得所需的結果。我不確定這是否100%正確,但這是它的工作原理,如果它遇到除a-z A-Z 0-9(。)(_)和( - )以外的任何字符,它將返回true。

我想知道我的邏輯在這裏是否有缺陷。

在前面的答案中,我已經看到了一些應該或不應該逃脫的討論。對於這個例子,我逃脫了任何東西,但是你應該逃避( - )減號字符的安全,因爲它會「破壞」你的表達,除非它在列表的末尾。 (。)方括號內的(。)點字符不需要在([])方括號內轉義,但如果你真的逃過它,它不會傷害你。

有關更多詳細信息,請參閱Java Patterns

5

更簡單

myString = myString.replaceAll("[^\\w.-]", "_"); 

預定義字符類:

  • \w字字符:[a-zA-Z_0-9]
8

如果您正在尋找在Windows平臺上的選項,那麼你可以試試下面的解決方案要使用「\ /:*?」以外的所有有效字符<> |「文件名

fileName = fileName.replaceAll("[\\\\/:*?\"<>|]", "_"); 
+0

這夠好。尤其是對於unicode文件名。 – goodhyun 2017-06-23 12:42:15

+1

您可以使用全角對應替換非法字符:'/ \\:*?「<> |' – Juribiyan 2017-10-07 08:09:56

+1

對不起,應該使用正則表達式4倍反斜槓而不是2倍?例如:''[\\\\ /:*?\「<> |]」' – kevinarpe 2017-10-16 08:13:35