java-替换fileName中的非法字符

在Java中,我有一个文件名字符串。 在那里我想用'_代替所有非法字符,但不是a-z0-9-._

我尝试了以下代码:但这没有用!

myString = myString.replaceAll("[\\W][^\\.][^-][^_]", "_");
bbholzbb asked 2020-02-13T20:33:57Z
6个解决方案
92 votes

您需要替换除[a-zA-Z0-9.-]之外的所有内容。括号内的^表示“否”。

myString = myString.replaceAll("[^a-zA-Z0-9\\.\\-]", "_");
poitroae answered 2020-02-13T20:34:15Z
20 votes

如果您正在Windows平台上寻找选项,则可以尝试以下解决方案来利用文件名中除“ \ /:*?” <> |”以外的所有有效字符。

fileName = fileName.replaceAll("[\\\\/:*?\"<>|]", "_");
Prakash answered 2020-02-13T20:34:35Z
15 votes

把事情简单化。

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

[http://ideone.com/TINsr4]

Matt Ball answered 2020-02-13T20:34:59Z
7 votes

更简单

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

预定义字符类:

  • \w一个字字符:[a-zA-Z_0-9]
IvanRF answered 2020-02-13T20:35:27Z
1 votes

我知道这里已经有一些答案了,但是我想指出,我不得不对给出的建议进行些微修改。

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

这是我必须在Java中用于.matches才能获得所需结果的方法。 我不确定这是否100%正确,但这是它的工作方式,如果遇到除a-z A-Z 0-9(。)(_)和(-)以外的其他任何字符,它将返回true。

我想知道我的逻辑是否有任何缺陷。

在先前的答案中,我已经看到了一些关于应该或不应该逃避什么的讨论。 对于此示例,我已经逃脱了,没有转义任何内容,但是为了安全起见,您应该转义(-)减号,因为它会“破坏”您的表达式,除非它位于列表的末尾。(。)点字符不一定要在([])方括号内转义,但是如果您转义它也不会伤害您。

请参阅Java模式以获取更多详细信息。

Atspulgs answered 2020-02-13T20:36:06Z
0 votes

如果要使用[A-Za-z0-9]之类的字符,请检查MS命名约定,不要忘记滤除“ ...整数表示形式介于1到31之间的字符,... ”。

wandlang answered 2020-02-13T20:36:26Z
translate from https://stackoverflow.com:/questions/15075890/replacing-illegal-character-in-filename