通过正则表达式验证文件类型


77

我有一个.NET Web窗体,该窗体具有一个与正则表达式验证器绑定的文件上传控件。该验证器需要验证仅允许上传某些文件类型(jpg,gif,doc,pdf)

当前执行此操作的正则表达式为:


^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF|.doc|.DOC|.pdf|.PDF)$

但是,这似乎不起作用...任何人都可以给我一点reg ex帮助吗?


18
我敢肯定,您知道这一点,但是,如果以后有人发现以下问题却又没有发现:该方法将只验证文件的扩展名,而不验证其实际类型。收到文件后,您必须检查其内容以确定其实际内容。如果您依赖该名称,则是一个巨大的安全漏洞。
戴夫·谢罗曼

Answers:


167

我认为您的正则表达式似乎太复杂了。另外,请记住,点是一个特殊字符,表示“任何字符”。以下正则表达式应该起作用(请注意转义的点):

^.*\.(jpg|JPG|gif|GIF|doc|DOC|pdf|PDF)$

您可以使用Expresso之类的工具来测试您的正则表达式。


在.NET中进行正则表达式时,不需要枚举大小写差异。例如,它不仅会降低可读性,而且还会降低性能(如果在循环中调用它)。
约瑟夫·费里斯

2
问题是正则表达式用于RegularExpressionValidator ASP.NET控件中,而AFAIK不接受IgnoreCase之类的选项。
达里奥·索雷拉

我在原始帖子中错过了。是的,几年来,RegularExpressionValidator区分大小写选项是Microsoft一直忽略的整个社区的要求。
约瑟夫·弗里斯

1
您可以忽略^。*,因为“从头开始匹配任何内容,直到此表达式结束为止”与“匹配此表达式末尾”相同。您还可以嵌入正则表达式选项msdn.microsoft.com/en-us/library/yd1hzczs.aspx
ICR

为了嵌入正则表达式选项以忽略大小写,您需要禁用ClientSide脚本(我不认为JavaScript支持它)。然后,您可以将“(?i:。(jpg | gif | doc | pdf))$”用于不区分大小写的匹配。
马丁·布朗

19
^.+\.(?:(?:[dD][oO][cC][xX]?)|(?:[pP][dD][fF]))$

将接受文件名至少为一个字符的.doc,.docx,.pdf文件:

^           = beginning of string
.+          = at least one character (any character)
\.          = dot ('.')
(?:pattern) = match the pattern without storing the match)
[dD]        = any character in the set ('d' or 'D')
[xX]?       = any character in the set or none 
              ('x' may be missing so 'doc' or 'docx' are both accepted)
|           = either the previous or the next pattern
$           = end of matched string

警告!如果不将整个扩展链都包含在(?:)中,则将通过.docpdf这样的扩展名。

您可以在http://www.regextester.com/上测试正则表达式


15

您是否只是在想验证文件是否具有给定的扩展名?您可以使用以下方法简化尝试执行的操作:

(.*?)\.(jpg|gif|doc|pdf)$

然后,当您调用IsMatch()时,请确保将RegexOptions.IgnoreCase传递为第二个参数。没有理由必须列出套管的变体。

编辑:如Dario所述,这不适用于RegularExpressionValidator,因为它不支持大小写选项。


1
这个允许将点包含在文件名中,这对我来说很好
Bronek '18

12

您可以将不区分大小写的内容嵌入到正则表达式中,如下所示:

\.(?i:)(?:jpg|gif|doc|pdf)$

1
除非您启用了客户端脚本选项,否则此操作将失败。
马丁·布朗

Afaik javascript确实允许使用内联选项,但它适用于整个正则表达式,而不仅限于其后的所有内容,在这种情况下,这无关紧要。除非有其他原因,否则它将无法正常工作(我无法测试atm)。
ICR

2
不,JS根本不支持内联修饰符。另外,即使在.NET中,您的正则表达式也无法使用;您需要“ \。(?i)(?: jpg | gif | doc | pdf)$”或“ \。(?i:jpg | gif | doc | pdf)$”。这:“(?i :)”不匹配任何内容,不区分大小写。
艾伦·摩尔

6

您可以为每种文件类型使用此模板:

ValidationExpression="^.+\.(([pP][dD][fF])|([jJ][pP][gG])|([pP][nN][gG])))$"

例如:您可以[rR][aA][rR]为Rar文件类型等添加()...


5

您的正则表达式似乎同时验证了文件名和扩展名。那是你需要的吗?我假设它只是扩展名,并且将使用这样的正则表达式:

\.(jpg|gif|doc|pdf)$

并将匹配设置为不区分大小写。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.