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

时间:2012-06-19 12:21:40

标签: javascript regex

我有一个regexp来验证文件名。这是它:

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

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

aaa
aaa.ext
a#
A9#.ext

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

问题是*.txt/\kk等文件名通过了验证。我正在使用keyup事件进行验证。因此,当我在不允许的情况下添加一个额外字符后,它会显示一切正确。

6 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:0)

我会尝试使用这个Regex(您甚至可以使用它为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上)。

答案 5 :(得分:0)

由于this post (regex-for-windows-file-name)重定向到此问题,因此我假设其与Windows文件名有关。

然后根据@Leon的评论和reference在@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