在Java中,我有一个文件名字符串。在那里,我想用'_'替换所有非法字符,但不是a-z
,0-9
,-
,.
和_
我尝试了以下代码:但这没效果!
myString = myString.replaceAll("[\\W][^\\.][^-][^_]", "_");
答案 0 :(得分:85)
您需要替换[a-zA-Z0-9.-]
以外的所有内容。
括号内的^
代表“NOT”。
myString = myString.replaceAll("[^a-zA-Z0-9\\.\\-]", "_");
答案 1 :(得分:19)
如果您正在寻找Windows平台上的选项,那么您可以尝试使用以下解决方案来使用文件名中除“\ /:*?”<> |“之外的所有有效字符。
fileName = fileName.replaceAll("[\\\\/:*?\"<>|]", "_");
答案 2 :(得分:14)
答案 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, "_");