C# 有效文件名的正则表达式
我已经在StackOverflow中讨论了一些关于这个的问题,但是在我的案例中没有什么帮助 我想限制用户提供的文件名应仅包含字母数字字符、C# 有效文件名的正则表达式,c#,regex,C#,Regex,我已经在StackOverflow中讨论了一些关于这个的问题,但是在我的案例中没有什么帮助 我想限制用户提供的文件名应仅包含字母数字字符、-、-、和空格 我不擅长正则表达式,到目前为止,我提出了这个^[a-zA-Z0-9.-\uz]$。有人能帮我吗?使用这个正则表达式^[a-zA-Z0-9.\u-]+$来验证文件名,我建议使用C提供的函数而不是正则表达式 if (filename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1
-
、-
、
和空格
我不擅长正则表达式,到目前为止,我提出了这个
^[a-zA-Z0-9.-\uz]$
。有人能帮我吗?使用这个正则表达式^[a-zA-Z0-9.\u-]+$
来验证文件名,我建议使用C提供的函数而不是正则表达式
if (filename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
}
这是正确的表达:
string regex = @"^[\w\-. ]+$";
string regex = @"^[\w\-\. ]+$";
\w
相当于[0-9a-zA-Z!]
这是对工程师答案的一个小改动
string regex = @"^[\w\- ]+[\w\-. ]*$"
这将阻止无效的“.txt”
问题是,它确实阻止了从@Engineer复制的有效的
“.txt”
,以供将来参考,因为在大多数投票的答案中,点没有逃逸(它应该逃逸)
这是正确的表达:
string regex = @"^[\w\-. ]+$";
string regex = @"^[\w\-\. ]+$";
虽然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且没有空格的文件扩展名
我已经在上进行了测试,但为了将来参考,这是我的“测试套件”:
如果其他人需要验证文件名(包括Windows保留字等),以下是完整表达式:
\A(?)
扩展表达式(不允许文件名以2点开头,不允许文件名以点或空格结尾):
\A(?)
编辑:
对于感兴趣的用户,以下是指向Windows文件命名约定的链接:
我刚刚创建了这个。它可以防止两个点以及结尾和开头的点。但是它不允许任何两个点
^([a-zA-Z0-9_]+)\.(?!\.)([a-zA-Z0-9]{1,5})(?<!\.)$
^([a-zA-Z0-9\]+)\(?!\)([a-zA-Z0-9]{1,5})(?我可能在这里说了一些愚蠢的话,但在我看来,这些答案是不正确的。首先,我们在这里谈论的是Linux还是Windows(或其他操作系统)
其次,在Windows中(我相信)在文件名中包含“$”是完全合法的,更不用说一般的Unicode了。这似乎是可能的
我试图找到一个明确的信息来源……结果是:特别是“保留字符和单词”一节似乎很相关:很明显,这些是一个不允许输入的列表
我身处Java世界。我很自然地认为Apache Commons会有类似于validateFilename
的东西,可能在FilenameUtils
中……但它似乎不是这样(如果已经这样做了,这对C程序员来说仍然可能有用,因为代码通常很容易理解,因此可以翻译)不过,我确实做了一个实验,使用了规范化:让我失望的是,它允许完全无效的字符(?)等)通过
上面提到的Wikip文件名页面的部分显示,这个问题取决于您使用的操作系统……但至少可以为Linux和Windows编造一些简单的正则表达式
然后我找到了一种Java方式(至少):
输出:
java.nio.file.InvalidPathException:索引4处的非法字符:
bobb???:mouse.blip
…可能不同的文件系统
对象对于完整字符集(Unicode)的使用将具有不同的验证规则
^[\p{L}0-9\-.~]+$
或许
^[\p{L}\p{N}\-.~]+$
如果我们讨论的是Unicode,则更准确
我添加了一个“~”,只是因为我有一些文件使用了这个字符。juergen d,^[a-zA-Z0-9-\+$
但是文件名可以包含点字符串regex=@“^[a-zA-Z0-9\.-\+$”
理解你的意思,点在[
中并没有任何符号,它是点-1,就像[.-]
是/0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
@标记它将匹配
、=
、@
等字符。您也可以尝试这些字符。OP希望限制有效字符。您的意思是当用户键入文件名的字符时?即使这样,我们也可以订阅按键或按键事件并进行检查,避免该字符成为pa文件名中的rt如果必须是正则表达式,我将使用GetInvalidFileNameChars构建此正则表达式。^[^/:*\?\ \ \124;]*$=>没有InvalidFileNameChar允许的所有内容在文档中,它表示“此方法返回的数组不保证包含文件名和目录名中无效的完整字符集。”。这会使这种技术有点风险。使用包含列表比使用排他列表更安全。什么