我已经阅读了几个回答这个问题的问题,我理解我需要使用的正则表达式,但实际上在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; }
}
每当我尝试将正则表达式更改为@"^[\\/:?"<>|]+$
时,“中间的”会将其杀死并抛出错误。我还没弄清楚如何正确地将其转义以便我可以将其包含在字符串中。我使用正则表达式没有“它告诉我我放入文本框的任何字符串失败。我错误地使用了^
吗?
答案 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);
这与之匹配:
<>:"/\|?*
请注意,这与文件名匹配,而不是文件路径。一个文件路径更复杂,因为它有粗略的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?