Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 用于文件名验证的视图模型中的ASP.net MVC正则表达式_Asp.net Mvc_Regex - Fatal编程技术网

Asp.net mvc 用于文件名验证的视图模型中的ASP.net MVC正则表达式

Asp.net mvc 用于文件名验证的视图模型中的ASP.net MVC正则表达式,asp.net-mvc,regex,Asp.net Mvc,Regex,我已经阅读了一些回答这个问题的问题,我理解我需要使用的正则表达式,但是在MVC中实际应用它是我遇到的困难。我还将在序言中说,到目前为止,我在正则表达式方面很糟糕 我正在用MVC编写一个文件上传应用程序,我想应用标准的windows文件名验证\/:*?“|是名称中任何位置的无效字符 我的视图模型是这样设置的,使用不同的正则表达式: public class FileRenameModel { [RegularExpression(@"^[\w\-. ]+$", ErrorMessa

我已经阅读了一些回答这个问题的问题,我理解我需要使用的正则表达式,但是在MVC中实际应用它是我遇到的困难。我还将在序言中说,到目前为止,我在正则表达式方面很糟糕

我正在用MVC编写一个文件上传应用程序,我想应用标准的windows文件名验证<代码>\/:*?“|是名称中任何位置的无效字符

我的视图模型是这样设置的,使用不同的正则表达式:

    public class FileRenameModel
{
    [RegularExpression(@"^[\w\-. ]+$", ErrorMessage="A filename cannot contain \\ / : * ? \" < > |")]
    [Required]
    public string Filename { get; set; }
    [Required]
    public int FileID      { get; set; }
}
公共类文件重命名模型
{
[正则表达式(@“^[\w\-.]+$”,ErrorMessage=“文件名不能包含\\/:*?\”<>”)
[必需]
公共字符串文件名{get;set;}
[必需]
public int FileID{get;set;}
}
每当我试图将正则表达式改为<代码> >“^ [\/],] + $< /代码>时,“在中间杀死它并引发错误。我还没弄清楚如何正确地将它包含在字符串中。当我使用正则表达式时,”它告诉我,任何放入文本框的字符串都失败了。我是否错误地使用了
^

在使用
@
启动字符串后,使用double
转义引号

要搜索除此之外的任何内容,您需要在括号内插入一个额外的
^
,以创建除此之外的匹配:
@“^[^\\\/:?”“|]+$”
^
保留在行的开头,并与行的开头相匹配


话虽如此,为了验证浏览器处理文件名的方式是否不同,请记住。一些较旧的浏览器随文件名一起发送了路径,这可能会破坏您对合法文件的验证。

此正则表达式应匹配足够多的有效NTFS文件名子集(请记住,NTFS文件名可能包含几乎所有的Unicode字符。)


这一部分帮助我解决了这个问题”“谢谢。但不幸的是,我仍然停留在逻辑上。谢谢你,保罗。在检查你的评论之前,我尝试了这个方法,它成功了,但现在我有了一个解释,为什么要这样做。我必须检查我的验证是否破坏了一个合法的文件名。是的,通常这会起作用,但正如我所说的,一些浏览器发送实际路径或预先添加一些奇怪的内容,如://。如果可以的话,最好是通过删除
System.IO.Path.GetInvalidPathChars()
返回的任何字符来清理请求处理程序中的文件名。我完全意识到我实际上已经实现了清理。今天早上咖啡不够。再次感谢,这对我来说是一次很好的学习经历。
Regex rxValidFileName = new Regex(@"^[[\p{IsBasicLatin}\p{IsLatin-1Supplement}\p{IsLatinExtended-A}\p{IsLatinExtended-B}]-[\p{C}<>:""/\|?*]]+$" , RegexOptions.IgnorePatternWhitespace|RegexOptions.IgnoreCase);
filepath : relative-path
         | absolute-path
         | drivespecifier (relative-path|absolute-path)?
         | unc-share (absolute-path)?
         ;

relative-path : filename ( directory-separator filename? )*

absolute-path : directory-separator ( filename? directory-separator )*

directory-separator : [/\]

drivespecifier : [a-zA-Z] ":"

unc-share : "\\" filename "\" filename absolute-path?