2

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

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

4

2 回答 2

4

""在以 .开头的字符串后使用 double转义引号@

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

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

于 2013-05-02T18:03:12.837 回答
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个或多个
    • 任何基本的拉丁语、latin-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?
于 2013-05-02T19:06:44.753 回答