60

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

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

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

6 回答 6

110

您需要替换所有内容,但[a-zA-Z0-9.-]. 括号内^的代表“NOT”。

myString = myString.replaceAll("[^a-zA-Z0-9\\.\\-]", "_");
于 2013-02-25T20:30:38.913 回答
29

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

fileName = fileName.replaceAll("[\\\\/:*?\"<>|]", "_");
于 2016-12-12T20:11:38.737 回答
16

把事情简单化。

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

http://ideone.com/TINsr4

于 2013-02-25T20:31:08.740 回答
12

更简单

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

预定义的字符类:

  • \w 一个字字符:[a-zA-Z_0-9]
于 2016-02-24T00:43:27.847 回答
2

我知道这里已经有了一些答案,但我想指出我必须稍微改变给定的建议。

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

这就是我必须在 Java 中使用 .matches 来获得所需的结果。我不确定这是否 100% 正确,但这就是它对我的工作方式,如果遇到 az AZ 0-9 (.) (_) 和 (-) 以外的任何字符,它将返回 true。

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

在以前的答案中,我看到了一些关于应该或不应该逃避什么的讨论。对于这个例子,我没有转义任何东西,但你应该转义 (-) 减号字符以确保安全,因为它会“破坏”你的表达式,除非它位于列表的末尾。(.) 点字符不必在看起来的 ([]) 方括号内转义,但如果您转义它不会对您造成伤害。

有关详细信息,请参阅 Java模式。

于 2015-08-24T13:32:41.207 回答
0

如果您想使用的不仅仅是 [A-Za-z0-9],请检查MS Naming Conventions,并且不要忘记过滤掉“...整数表示在 1 到 31 范围内的字符,... ”。

于 2018-02-24T12:12:13.363 回答