有效文件名的正则表达式

VJA*_*JAI 37 c# regex

我已经在StackOverflow中解决了一些关于此的问题,但在我的情况下没有任何帮助.

我想限制用户提供应该只包含字母数字字符,文件名-,_,.和空间.

我对正则表达式并不擅长,到目前为止我想出了这个^[a-zA-Z0-9.-_]$.有人能帮助我吗?

Eng*_*eer 57

这是正确的表达方式:

string regex = @"^[\w\-. ]+$";
Run Code Online (Sandbox Code Playgroud)

\w相当于[0-9a-zA-Z_].

  • `\ w`在英语词典中只相同,所以应该是`^ [0-9a-zA-Z _\ - .] + $`而不是 (4认同)
  • 不应该是“.”吗?被逃脱?'.' 的文档 说“匹配除\n之外的任何单个字符” (3认同)
  • 文件名不应以空格开头,因此 @"^[\w\-.][\w\-.]*$" 可能会好一点。 (3认同)
  • @按位'.' 当它出现在字符类中时不需要转义。 (2认同)
  • 这将删除有效字符,例如 $ (2认同)

Vin*_*oth 27

要验证文件名,我建议使用C#提供的函数而不是正则表达式

if (filename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
}
Run Code Online (Sandbox Code Playgroud)

  • OP想要限制有效字符. (2认同)
  • 在文档中,它说“不能保证从此方法返回的数组包含在文件和目录名称中无效的完整字符集。”。这会使这种技术有点冒险。使用包含列表而不是排除列表更安全。 (2认同)

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


Joh*_*dal 8

虽然OP要求接近当前接受的答案所使用的(^[\w\-. ]+$),但是可能有其他人看到这个问题具有更具体的约束.

首先\w,根据OP的限制,在非美国/ GB机器上运行,将允许来自外语的各种不需要的字符.

其次,如果文件扩展名包含在名称中,则允许各种奇怪的,但有效的文件名,如file .txtfile...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)