有效文件名的正则表达式

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

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

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

这是正确的表达方式:

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

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

要validation文件名,我建议使用C#提供的function而不是正则表达式

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

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

首先,根据OP的限制,在非US / GB机器上运行, \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上测试了这个,但为了将来参考,这是我的“测试套件”:

 ## BELOW SHOULD MATCH web.config httpd.conf test.txt 1.1 my long file name.txt ## BELOW SHOULD NOT MATCH - THOUGH VALID æøå.txt hosts .gitignore .htaccess 

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

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

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

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

这将阻止无效的".txt"

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

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

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

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

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

我试图获得一个明确的来源……并最终在Wikip Filename页面上 :特别是“保留字符和单词”部分似乎是相关的:这些显然是一个你不允许的事情列表投入

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

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

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

 Path path = java.nio.file.FileSystems.getDefault().getPath( 'bobb??::mouse.blip' ); 

输出:

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

…据推测,不同的FileSystem对象将具有不同的validation规则

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

这是正确的表达方式:

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