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

时间:2013-05-02 17:47:50

标签: asp.net-mvc regex

我已经阅读了几个回答这个问题的问题,我理解我需要使用的正则表达式,但实际上在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; }
}

每当我尝试将正则表达式更改为@"^[\\/:?"<>|]+$时,“中间的”会将其杀死并抛出错误。我还没弄清楚如何正确地将其转义以便我可以将其包含在字符串中。我使用正则表达式没有“它告诉我我放入文本框的任何字符串失败。我错误地使用了^吗?

2 个答案:

答案 0 :(得分:4)

使用""启动字符串后,使用double @来转义引号。

除了您想要在括号内插入额外的^以创建匹配项以外的任何内容时,要搜索任何内容:@"^[^\\/:?""<>|]+$"保持^在开头也匹配行的开始。

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

答案 1 :(得分:1)

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

Regex rxValidFileName = new Regex(@"^[[\p{IsBasicLatin}\p{IsLatin-1Supplement}\p{IsLatinExtended-A}\p{IsLatinExtended-B}]-[\p{C}<>:""/\|?*]]+$" , RegexOptions.IgnorePatternWhitespace|RegexOptions.IgnoreCase);

这与之匹配:

  • 行首,然后是
  • 1个或更多
    • 任何基本的拉丁,拉丁-1补充剂,或拉丁扩展-A或-B字符,除非......
    • 除非它是一个C0或C1控制字符或NTFS不允许的其中一个字符 - <>:"/\|?*
  • 以行尾结束。

请注意,这与文件名匹配,而不是文件路径。一个文件路径更复杂,因为它有粗略的ABNF语法,就像这样,

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?