我有一个regexp来验证文件名。这是它:
/[0-9a-zA-Z\^\&\'\@\{\}\[\]\,\$\=\!\-\#\(\)\.\%\+\~\_ ]+$/
它应该允许这样的文件名:
aaa
aaa.ext
a#
A9#.ext
不允许使用以下字符\ / : * ? \" < > |
问题是*.txt
或/\kk
等文件名通过了验证。我正在使用keyup事件进行验证。因此,当我在不允许的情况下添加一个额外字符后,它会显示一切正确。
答案 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