怎样使用正则表达式实现对原始文件名中非法字符(如*?:"|)的实时校验

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

|)的实时校验">

正则表达式是校验文件名非法字符最直接有效的方式,关键在于精准匹配 Windows 和部分文件系统禁止的字符集,并支持实时反馈(如输入时高亮、拦截或自动清理)。

明确哪些字符属于“非法”

Windows 文件系统禁止在文件名中使用以下 9 个字符: / : * ? " |(注意:斜杠 / 和反斜杠 均不可用, 和 <code>> 虽在资源管理器中不常输入,但同样被系统拒绝)。空格、点(.)、下划线、连字符等是合法的;开头或结尾的空格、点、空字符(u0000)虽不报错但可能被系统自动修剪,建议一并过滤。

核心正则模式及说明

推荐使用以下正则表达式进行校验:

/[/:*?"|]|s+$/
  • [/:*?"|]:字符类,精确匹配任意一个非法符号(注意 / 需转义)
  • s+$:匹配末尾一个或多个空白字符(含空格、制表符等),防止生成“xxx.txt ”这类易被截断的名称
  • 若还需禁止开头空白或连续空格,可扩展为 ^s+|[/:*?"|]|s+$

实时校验的典型实现方式

以 Web 前端为例,在用户输入文件名时即时响应:

  • 监听 inputkeyup 事件,获取当前输入值
  • regex.test(filename) 判断是否含非法字符
  • 若命中,立即标红输入框、显示提示(如“文件名不能包含 : * ? 等字符”),并可选禁用提交按钮
  • 进阶做法:用 filename.replace(/[/:*?"|]/g, '_') 实时替换非法字符为下划线,提升体验

服务端必须二次校验

前端校验可被绕过,服务端收到文件名后必须再次执行相同正则判断。例如 Node.js 中:

if (/[u0000-u001F/:*?"|]|s+$/u.test(filename)) { throw new Error('非法文件名'); }

补充说明:u0000-u001F 覆盖 ASCII 控制字符(如 u0000 空字符),u 标志确保正确处理 Unicode。

相关文章

精彩推荐