正则表达式是校验文件名非法字符最直接有效的方式,需精准匹配Windows禁止的9个字符( / : ? " |)及末尾空白符,推荐模式为/[[/:?"|]|s+$/,前后端均须校验。
|)的实时校验">
正则表达式是校验文件名非法字符最直接有效的方式,关键在于精准匹配 Windows 和部分文件系统禁止的字符集,并支持实时反馈(如输入时高亮、拦截或自动清理)。
明确哪些字符属于“非法”
Windows 文件系统禁止在文件名中使用以下 9 个字符: / : * ? " |(注意:斜杠 / 和反斜杠 均不可用, 和 <code>> 虽在资源管理器中不常输入,但同样被系统拒绝)。空格、点(.)、下划线、连字符等是合法的;开头或结尾的空格、点、空字符(u0000)虽不报错但可能被系统自动修剪,建议一并过滤。
核心正则模式及说明
推荐使用以下正则表达式进行校验:
/[\/:*?"|]|s+$/-
[\/:*?"|]:字符类,精确匹配任意一个非法符号(注意和/需转义) -
s+$:匹配末尾一个或多个空白字符(含空格、制表符等),防止生成“xxx.txt ”这类易被截断的名称 - 若还需禁止开头空白或连续空格,可扩展为
^s+|[\/:*?"|]|s+$
实时校验的典型实现方式
以 Web 前端为例,在用户输入文件名时即时响应:
- 监听
input或keyup事件,获取当前输入值 - 用
regex.test(filename)判断是否含非法字符 - 若命中,立即标红输入框、显示提示(如“文件名不能包含 : * ? 等字符”),并可选禁用提交按钮
- 进阶做法:用
filename.replace(/[\/:*?"|]/g, '_')实时替换非法字符为下划线,提升体验
服务端必须二次校验
前端校验可被绕过,服务端收到文件名后必须再次执行相同正则判断。例如 Node.js 中:
if (/[u0000-u001F\/:*?"|]|s+$/u.test(filename)) { throw new Error('非法文件名'); }补充说明:u0000-u001F 覆盖 ASCII 控制字符(如 u0000 空字符),u 标志确保正确处理 Unicode。











