从文件名中删除非法字符但保留空格。

34
我有以下代码来从文件名中删除非法字符:

我有以下代码来从文件名中删除非法字符:

str= str.replace(/([^a-z0-9]+)/gi, '-');

那个方法可以正常工作,但它也会移除空格,怎样只移除非法字符但保留空格呢?


你如何确定“非法”字符?你的正则表达式说“.”、“_”和许多其他字符是“非法”的,为什么? - Toto
3
只需将空格加入类别 [^a-z0-9 ] 中即可,这样它就不会被匹配(删除)。 - user557597
4个回答

76

非法字符请查看此处。使用以下正则表达式/[/\\?%*:|"<>]/g替换它们:

var filename = "f?:i/le>  n%a|m\\e.ext";

filename = filename.replace(/[/\\?%*:|"<>]/g, '-');

console.log(filename);


这些字符取决于操作系统。在Linux下,文件名可以包含任何字符,甚至是空格。 - Toto
@Toto 我排除了 . 的情况,因为它们并不真正违法! - ibrahim mahrir
您错过了ASCII范围0-31(包括)中的不可打印字符。 - Stefan Steiger
2
不赞成投票,因为允许白名单中的字符比尝试阻止黑名单中的无效字符更安全。 - halllo
@EugeneP. 不需要转义这些字符,因为在字符类中,它们被视为字面量。 - ibrahim mahrir
显示剩余2条评论

8

8
你正在搜索所有非数字和罗马字母。如果你想排除空格不被替换:
只需将一个空格添加到选择中以排除 :)
str= str.replace(/([^a-z0-9 ]+)/gi, '-');
// add a space here -------^

抱歉,我不太明白你的意思,请您能解释一下吗? - user3378165
你的正则表达式似乎匹配不是小写字母a-z、大写字母A-Z和数字0-9的字符,并替换匹配到的内容。为了避免替换空格,按照我的建议添加一个空格可以实现你想要的效果,因为你试图匹配在方括号 [ .. ] 中未包含的任何内容。 - Pineda
这个解决方案是不正确的。因为它也会替换所有有效的非ASCII字符。 - undefined

1
将“\s”空格符添加到您的排除列表中。
str = str.replace(/([^a-z0-9\s]+)/gi, '-');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接