有效文件名的正则表达式
我已经在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 .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_-]+$
它确保只使用英文字母,没有开始或尾随空格,并确保使用长度至少为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\-\. ]+$";