Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有效文件名的正则表达式_C#_Regex - Fatal编程技术网

C# 有效文件名的正则表达式

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

我已经在StackOverflow中讨论了一些关于这个的问题,但是在我的案例中没有什么帮助

我想限制用户提供的文件名应仅包含字母数字字符、
-
-
和空格


我不擅长正则表达式,到目前为止,我提出了这个
^[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允许的所有内容在文档中,它表示“此方法返回的数组不保证包含文件名和目录名中无效的完整字符集。”。这会使这种技术有点风险。使用包含列表比使用排他列表更安全。什么