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

C# 通过正则表达式验证文件类型,c#,asp.net,.net,regex,C#,Asp.net,.net,Regex,我有一个.NETWebForm,它有一个绑定到正则表达式验证器的文件上载控件。此验证器需要验证是否只允许上载某些文件类型(jpg、gif、doc、pdf) 执行此操作的当前正则表达式是: ^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF|.doc|.DOC|.pdf|.PDF)$ 然而,这似乎不起作用。。。谁能给我一点regex帮助吗?我觉得你的regex有点太复杂了。此外,请记住,点是一个特殊字符,表示“任何字符”

我有一个.NETWebForm,它有一个绑定到正则表达式验证器的文件上载控件。此验证器需要验证是否只允许上载某些文件类型(jpg、gif、doc、pdf)

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


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

然而,这似乎不起作用。。。谁能给我一点regex帮助吗?

我觉得你的regex有点太复杂了。此外,请记住,点是一个特殊字符,表示“任何字符”。以下正则表达式应该有效(注意转义点):


您可以使用类似于测试正则表达式的工具。

您只是想验证文件是否具有给定的扩展名吗?您可以通过以下方式简化您尝试执行的操作:

(.*?)\.(jpg|gif|doc|pdf)$
\.(jpg|gif|doc|pdf)$
然后,在调用IsMatch()时,请确保将RegexOptions.IgnoreCase作为第二个参数传递。没有理由必须列出套管的变化


编辑:正如Dario提到的,这对RegularExpressionValidator不起作用,因为它不支持大小写选项。您的regexp似乎同时验证了文件名和扩展名。这就是你需要的吗?我将假设它只是一个扩展,并将使用如下regexp:

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

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

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

\.(?i:)(?:jpg|gif|doc|pdf)$
将接受文件名至少包含一个字符的.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这样的扩展就会通过


您可以在

测试正则表达式。您可以对每种文件类型使用此模板:

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

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

在.NET中执行正则表达式时,不需要枚举大小写差异。例如,它不仅会降低可读性,而且如果在循环中调用它也会降低性能。问题是正则表达式用于RegularExpressionValidator ASP.NET控件,AFAIK不接受IgnoreCase之类的选项。我在最初的帖子中遗漏了这一点。是的,RegularExpressionValidator区分大小写选项是Microsoft几年来一直忽略整个社区请求的内容。您可以省去“^.*”,因为“从头到尾匹配任何内容”与“在结尾匹配此表达式”相同。您还可以嵌入正则表达式选项,以便嵌入正则表达式选项以忽略需要禁用客户端脚本的情况(我认为JavaScript不支持它)。然后,您可以使用“(?i:(jpg | gif | doc | pdf))$”进行不区分大小写的匹配。但如果您保持启用客户端脚本选项,则此操作将失败。Afaik javascript确实允许内联选项,但它适用于整个正则表达式,而不仅仅是它之后的所有内容,这在本例中并不重要。除非有另一个原因它不能工作(我不能测试atm)。不,JS根本不支持内联修饰符。而且,您的正则表达式即使在.NET中也无法工作;您想要“\。(?i)(?jpg | gif | doc | pdf)$”或“\。(?i:jpg | gif | doc | pdf)$”。这个:“(?i:)”只是不区分大小写地匹配任何内容。我相信您知道这一点,但是,如果以后有人发现了这个问题,谁不知道呢:这个方法将只验证文件的扩展名,而不是它的实际类型。收到文件后,必须检查其内容,以确定其真实内容。如果你依赖于文件名,这是一个巨大的安全漏洞。这个漏洞允许在文件名中包含点,这对我来说很好