替换fileName中的非法字符

时间:2013-02-25 20:29:20

标签: java regex replace

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

我尝试了以下代码:但这没效果!

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

7 个答案:

答案 0 :(得分:85)

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

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

答案 1 :(得分:19)

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

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

答案 2 :(得分:14)

保持简单。

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

http://ideone.com/TINsr4

答案 3 :(得分:6)

更简单

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

预定义字符类:

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

答案 4 :(得分:1)

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

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

这是我在Java中使用.matches来获得所需结果的原因。我不确定这是否100%正确,但这对我有用,如果它遇到除AZ AZ 0-9(。)(_)和( - )之外的任何字符,它将返回true。

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

在之前的回答中,我已经看到了应该或不应该逃避的内容的一些讨论。对于这个例子,我已经离开而没有逃避任何事情,但是你应该逃避( - )减去角色是安全的,因为它会&#34;打破&#34;你的表达,除非它在列表的末尾。 (。)点字符不必在它看起来的([])方括号中被转义,但是如果你逃脱它就不会伤害你。

有关详细信息,请参阅Java Patterns

答案 5 :(得分:0)

如果你想使用的不仅仅是[A-Za-z0-9],那么请检查MS Naming Conventions,不要忘记过滤掉&#34; ...整数表示在范围内的字符从1到31,......&#34;。

答案 6 :(得分:0)

对于NodeJS(v10),函数 replaceAll()未定义!

解决方案是:

let newName = myString.replace(/[^a-zA-Z0-9.-]/gi, "_");