有效文件名的正则表达式

时间:2012-08-03 10:44:48

标签: c# regex

我已经在StackOverflow中解决了一些关于此的问题,但在我的案例中没有任何帮助。

我想限制用户提供一个只包含字母数字字符的文件名,-_.和空格。

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

10 个答案:

答案 0 :(得分:47)

这是正确的表达方式:

string regex = @"^[\w\-. ]+$";

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

答案 1 :(得分:25)

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

if (filename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
}

答案 2 :(得分:7)

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

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

其次,如果文件扩展名包含在名称中,则允许使用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_-]+$

它确保只使用英文字母,没有开头或尾随空格,并确保使用长度至少为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

答案 3 :(得分:4)

如果其他人需要验证文件名(包括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

编辑: 对于感兴趣的,这里是Windows文件命名约定的链接: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx

答案 4 :(得分:2)

使用此正则表达式^[a-zA-Z0-9._ -]+$

答案 5 :(得分:2)

这是工程师回答的一个小改动。

string regex = @"^[\w\- ]+[\w\-. ]*$"

这将阻止无效的".txt"

麻烦的是,它会阻止有效的"..txt"

答案 6 :(得分:0)

我刚创造了这个。它可以防止两个点和点在结束和开始。但它不允许任何两个点。

^([a-zA-Z0-9_]+)\.(?!\.)([a-zA-Z0-9]{1,5})(?<!\.)$

答案 7 :(得分:0)

我可能在这里说些蠢话,但在我看来这些答案并不正确。首先,我们在这里谈论Linux或Windows(或其他操作系统)吗?

其次,在Windows中,(我相信)在文件名中包含“$”是完全合法的,更不用说Unicode了。这当然有可能。

我试图找到一个明确的来源...并最终到达Wikip Filename page:特别是“保留字符和单词”部分似乎是相关的:这些显然是一系列的东西你不被允许投入。

我在Java世界。我自然地认为Apache Commons会有类似localhost:8181的东西,可能在validateFilename ......但它似乎没有(如果它已经完成,这仍然可能对C#程序员有用,因为代码通常很容易理解,因此可以翻译)。不过,我确实使用方法FilenameUtils做了一个实验:令我失望的是,它允许完全无效的字符(?等)“通过”。

上面引用的Wikip Filename页面的部分显示这个问题取决于你正在使用的操作系统......但至少可以为Linux和Windows编写一些简单的正则表达式。

然后我找到了一种Java方式(至少):

normalize

输出:

  

java.nio.file.InvalidPathException:索引4处的非法char:   梭?? :: mouse.blip

...大概不同的Path path = java.nio.file.FileSystems.getDefault().getPath( 'bobb??::mouse.blip' ); 个对象会有不同的验证规则

答案 8 :(得分:0)

使用完整字符集(Unicode) true

或者也许 ^[\p{L}0-9_\-.~]+$ 如果我们谈论Unicode会更准确。

我添加了一个'〜'只是因为我有一些文件使用该字符。

答案 9 :(得分:-3)

从@Engineer复制以供将来参考,因为在最多投票的答案中,点未被转义(应该如此)。

这是正确的表达方式:

string regex = @"^[\w\-\. ]+$";