17

我有一个正则表达式来验证文件名。就这个:

/[0-9a-zA-Z\^\&\'\@\{\}\[\]\,\$\=\!\-\#\(\)\.\%\+\~\_ ]+$/

它应该允许这样的文件名:

aaa
aaa.ext
a#
A9#.ext

不允许使用以下字符\ / : * ? \" < > |

问题是文件名喜欢*.txt/\kk通过了验证。我正在使用 keyup 事件进行验证。因此,当我在不允许的一个字符之后添加一个额外的字符时,它表明一切都是正确的。

4

6 回答 6

42

对于 Windows 名称。

var isValid=(function(){
  var rg1=/^[^\\/:\*\?"<>\|]+$/; // forbidden characters \ / : * ? " < > |
  var rg2=/^\./; // cannot start with dot (.)
  var rg3=/^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i; // forbidden file names
  return function isValid(fname){
    return rg1.test(fname)&&!rg2.test(fname)&&!rg3.test(fname);
  }
})();

isValid('file name');
于 2012-06-19T13:06:41.143 回答
9

您需要添加一个起始锚点:

/^[0-9a-zA-Z ... ]+$/

这告诉引擎从输入的开头一直匹配到输入的结尾,而对于您的原始表达式,它只需要在输入的结尾进行匹配。

于 2012-06-19T12:23:43.293 回答
8

您需要使用^and来锚定表达式$。例如:

/^[-\w^&'@{}[\],$=!#().%+~ ]+$/

请注意,您需要-在字符类中转义,或将其放置在第一个/最后一个。

于 2012-06-19T12:23:31.410 回答
5
/^(?!\.)(?!com[0-9]$)(?!con$)(?!lpt[0-9]$)(?!nul$)(?!prn$)[^\|\*\?\\:<>/$"]*[^\.\|\*\?\\:<>/$"]+$/

Must not be empty.
Must not start with .
Must not be com0-com9, con, lpt0-lpt9, nul, prn
Must not contain | * ? \ : < > $
Must not end with .
于 2014-12-08T03:46:31.390 回答
1

由于这篇文章(regex-for-windows-file-name)重定向到这个问题,我假设它是关于 windows 文件名的。

根据@Leon 对@AndrewD 的回答的评论和参考,我制作了这个正则表达式,它对我有用。

/^(con|prn|aux|nul|com[1-9]|lpt[1-9])$|([<>:"\/\\|?*])|(\.|\s)$/ig

根据命名约定(参见上面的参考资料),我同意“com0”应该是一个有效的文件名,但是如果您尝试在 Windows 上将文件命名为“com0”,它就不起作用,所以我猜这篇文章中缺少.

所以这个正则表达式会更安全

/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$|([<>:"\/\\|?*])|(\.|\s)$/ig
于 2018-12-05T14:53:42.950 回答
0

我会尝试使用这个正则表达式(你甚至可以用它为 ASP.NET MVC 制作一个验证属性!):

@"^[^\u0022\u003C\u003E\u007C\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u003A\u002A\u003F\u005C\u002F]*$"

如果它与输入匹配,则它是有效的文件名(至少在 Windows 上)。

于 2015-04-17T15:16:04.057 回答