我已经在StackOverflow中解决了一些关于此的问题,但在我的案例中没有任何帮助。
我想限制用户提供一个只包含字母数字字符的文件名,-
,_
,.
和空格。
我对正则表达式并不擅长,到目前为止我想出了这个^[a-zA-Z0-9.-_]$
。有人可以帮帮我吗?
答案 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 .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对此进行了测试,但为了将来参考,这是我的测试套件":
## 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\-\. ]+$";