regex 用于验证文件名的Javascript正则表达式

vdzxcuhz  于 2023-04-07  发布在  Java
关注(0)|答案(7)|浏览(190)

我有一个regexp来验证文件名。如下所示:

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

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

aaa
aaa.ext
a#
A9#.ext

不允许使用以下字符\ / : * ? \" < > |
问题是像*.txt/\kk这样的文件名通过了验证。我正在用keyup事件进行验证。所以当我在不允许的字符后添加一个额外的字符时,它表明一切都是正确的。

idv4meu8

idv4meu81#

对于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');
r6l8ljro

r6l8ljro2#

您需要添加起始锚:

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

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

k2fxgqgv

k2fxgqgv3#

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

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

注意,您需要在字符类中转义-,或者将其放在首位/末位。

daolsyd0

daolsyd04#

/^(?!\.)(?!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 .
7ivaypg9

7ivaypg95#

由于this post (regex-for-windows-file-name)重定向到这个问题,我假设它是关于windows文件名的。
根据@Leon对@AndrewD的回答的评论和reference,我做了这个正则表达式,它对我很有效。

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

根据命名约定(见上面的参考文献),我同意“com 0”应该是一个有效的文件名,但如果你试图在windows上命名一个文件“com 0”,它就不起作用了,所以我想这篇文章中没有提到。
所以这个正则表达式会更安全

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

zz2j4svz6#

我会尝试使用这个正则表达式(你甚至可以用它为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上)。

odopli94

odopli947#

试试这个:

^[0-9a-z_\-]{3,255}\.([a-z0-9]{2,5})$

它适用于任何文件名,最小3个字符,最大长度从255和扩展名从2到5个字符...文件名本身的字符允许数字,字符和减号和下划线...也许它有帮助。

相关问题