在 Java 中,我有一个文件名字符串。在那里我想用'_'替换所有非法字符,但不是a-z
,,,和0-9
-
.
_
我尝试了以下代码:但这没有用!
myString = myString.replaceAll("[\\W][^\\.][^-][^_]", "_");
您需要替换所有内容,但[a-zA-Z0-9.-]
. 括号内^
的代表“NOT”。
myString = myString.replaceAll("[^a-zA-Z0-9\\.\\-]", "_");
如果您正在寻找 Windows 平台上的选项,那么您可以尝试以下解决方案来使用文件名中除 "\/:*?"<>|" 之外的所有有效字符。
fileName = fileName.replaceAll("[\\\\/:*?\"<>|]", "_");
更简单
myString = myString.replaceAll("[^\\w.-]", "_");
预定义的字符类:
\w
一个字字符:[a-zA-Z_0-9]
我知道这里已经有了一些答案,但我想指出我必须稍微改变给定的建议。
filename.matches("^.*[^a-zA-Z0-9._-].*$")
这就是我必须在 Java 中使用 .matches 来获得所需的结果。我不确定这是否 100% 正确,但这就是它对我的工作方式,如果遇到 az AZ 0-9 (.) (_) 和 (-) 以外的任何字符,它将返回 true。
我想知道我的逻辑是否有任何缺陷。
在以前的答案中,我看到了一些关于应该或不应该逃避什么的讨论。对于这个例子,我没有转义任何东西,但你应该转义 (-) 减号字符以确保安全,因为它会“破坏”你的表达式,除非它位于列表的末尾。(.) 点字符不必在看起来的 ([]) 方括号内转义,但如果您转义它不会对您造成伤害。
有关详细信息,请参阅 Java模式。
如果您想使用的不仅仅是 [A-Za-z0-9],请检查MS Naming Conventions,并且不要忘记过滤掉“...整数表示在 1 到 31 范围内的字符,... ”。