<p>正则表达式是校验文件名非法字符最直接有效的方式,需精准匹配Windows禁止的9个字符( / : ? " |)及末尾空白符,推荐模式为/[[/:?"|]|s+$/,前后端均须校验。</p>
|)的实时校验">
正则表达式是校验文件名非法字符最直接有效的方式,关键在于精准匹配 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。