我已经在StackOverflow中解决了一些关于此的问题,但在我的情况下没有任何帮助.
我想限制用户提供应该只包含字母数字字符,文件名-,_,.和空间.
我对正则表达式并不擅长,到目前为止我想出了这个^[a-zA-Z0-9.-_]$.有人能帮助我吗?
Eng*_*eer 57
这是正确的表达方式:
string regex = @"^[\w\-. ]+$";
Run Code Online (Sandbox Code Playgroud)
\w相当于[0-9a-zA-Z_].
Vin*_*oth 27
要验证文件名,我建议使用C#提供的函数而不是正则表达式
if (filename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
}
Run Code Online (Sandbox Code Playgroud)
Krz*_*ski 10
如果其他人需要验证文件名(包括 Windows 保留字等),这是一个完整的表达式:
\A(?!(?:COM[0-9]|CON|LPT[0-9]|NUL|PRN|AUX|com[0-9]|con|lpt[0-9]|nul|prn|aux)|[\s\.])[^\\\/:*"?<>|]{1,254}\z
扩展表达式(不允许文件名以 2 个点开头,不允许文件名以点或空格结尾):
\A(?!(?:COM[0-9]|CON|LPT[0-9]|NUL|PRN|AUX|com[0-9]|con|lpt[0-9]|nul|prn|aux)|\s|[\.]{2,})[^\\\/:*"?<>|]{1,254}(?<![\s\.])\z
编辑:对于感兴趣的人,这里是 Windows 文件命名约定的链接:https : //msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
虽然OP要求接近当前接受的答案所使用的(^[\w\-. ]+$),但是可能有其他人看到这个问题具有更具体的约束.
首先\w,根据OP的限制,在非美国/ GB机器上运行,将允许来自外语的各种不需要的字符.
其次,如果文件扩展名包含在名称中,则允许各种奇怪的,但有效的文件名,如file .txt或file...txt.
第三,如果您只是将文件上传到文件系统,您可能需要一个黑名单文件和/或扩展名,如下所示:
web.config,hosts,.gitignore,httpd.conf,.htaccess
但是,这个问题远远超出了这个问题; 它需要有关设置的各种信息,以获得有关安全问题的良好指导.我认为我应该提出这个问题.
因此,对于用户可以输入完整文件名的解决方案,我会使用以下内容:
^[a-zA-Z0-9](?:[a-zA-Z0-9 ._-]*[a-zA-Z0-9])?\.[a-zA-Z0-9_-]+$
Run Code Online (Sandbox Code Playgroud)
它确保只使用英文字母,没有开始或尾随空格,并确保使用长度至少为1且没有空格的文件扩展名.
我在Regex101上测试了这个,但为了将来的参考,这是我的"测试套件":
## THE BELOW SHOULD MATCH
web.config
httpd.conf
test.txt
1.1
my long file name.txt
## THE BELOW SHOULD NOT MATCH - THOUGH VALID
æøå.txt
hosts
.gitignore
.htaccess
Run Code Online (Sandbox Code Playgroud)