C# – 文件path的正则expression式,例如C:\ test \ test.exe

我目前正在寻找一个正则expression式,可以帮助validation文件path例如:

C:\test\test2\test.exe 

我决定发表这个使用正则表达式的答案。

 ^(?:[a-zA-Z]\:|\\\\[\w\.]+\\[\w.$]+)\\(?:[\w]+\\)*\w([\w.])+$ 

适用于这些:

 \\test\test$\TEST.xls \\server\share\folder\myfile.txt \\server\share\myfile.txt \\123.123.123.123\share\folder\myfile.txt c:\folder\myfile.txt c:\folder\myfileWithoutExtension 

编辑:添加示例用法:

 if (Regex.IsMatch (text, @"^(?:[a-zA-Z]\:|\\\\[\w\.]+\\[\w.$]+)\\(?:[\w]+\\)*\w([\w.])+$")) { // Valid } 

*编辑:*这是您可以看到的路径的近似值。 如果可能的话,最好使用Path类或FileInfo类来查看文件或文件夹是否存在。

如果你的目标是处理文件名,我会推荐使用Path类而不是Regex。

例如,您可以调用Path.GetFullPath来“验证”一个路径,因为如果路径包含无效字符,则会引发ArgumentException ,如果路径太长,则会引发其他异常。等等。这将处理所有规则,这将很难得到正确的正则表达式。

提议的不是很好,这是我为XSD构建的,它是Windows特有的:

 ^(?:[a-zA-Z]\:(\\|\/)|file\:\/\/|\\\\|\.(\/|\\))([^\\\/\:\*\?\<\>\"\|]+(\\|\/){0,1})+$ 

试试这个用于Windows和Linux的支持: ((?:[a-zA-Z]\:){0,1}(?:[\\/][\w.]+){1,})

我使用这个正则表达式在windows(包括UNC和%变量%)中捕获有效的文件/文件夹路径,排除根路径如“C:\”或“\\ serverName”

 ^(([a-zA-Z]:|\\\\\w[ \w\.]*)(\\\w[ \w\.]*|\\%[ \w\.]+%+)+|%[ \w\.]+%(\\\w[ \w\.]*|\\%[ \w\.]+%+)*) 

这个正则表达式不匹配路径元素中的前导空格,所以

  • “C:\ program files”被匹配
  • “C:\ pathWithLeadingSpace”不匹配

变量在任何级别都是允许的

  • “%program files%”被匹配
  • “C:\我的路径与内部空间\%我var与内部空间%”匹配
 regex CmdPrompt("^([AZ]:[^\<\>\:\"\|\?\*]+>)"); 

基本上,我们查找不在禁止的Windows路径字符列表中的所有内容:

 < (less than) > (greater than) : (colon) " (double quote) | (vertical bar or pipe) ? (question mark) * (asterisk) 

这是Windows路径的正则表达式:

 (^([az]|[AZ]):(?=\\(?![\0-\37<>:"/\\|?*])|\/(?![\0-\37<>:"/\\|?*])|$)|^\\(?=[\\\/][^\0-\37<>:"/\\|?*]+)|^(?=(\\|\/)$)|^\.(?=(\\|\/)$)|^\.\.(?=(\\|\/)$)|^(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+))((\\|\/)[^\0-\37<>:"/\\|?*]+|(\\|\/)$)*()$ 

这是为UNIX / Linux路径

 ^\/$|(^(?=\/)|^\.|^\.\.)(\/(?=[^/\0])[^/\0]+)*\/?$ 

这是我的测试:

Win Regex

Unix正则表达式

这些使用Javascript

编辑我已经添加了相对路径,(../,./,../something)

我发现这里的大部分答案都是一个小小的失误。

在这里找到一个很好的解决方案

https://social.msdn.microsoft.com/forums/vstudio/en-US/31d2bc84-c948-4914-8a9d-97b9e788b341/validate-a-network-folder-path

注意* – 这只适用于网络共享 – 不是本地文件

回答:

 string pattern = @"^\\{2}[\w-]+(\\{1}(([\w-][\w-\s]*[\w-]+[$$]?)|([\w-][$$]?$)))+"; string[] names = { @"\\my-network\somelocation", @"\\my-network\\somelocation", @"\\\my-network\somelocation", @"my-network\somelocation", @"\\my-network\\somelocation",@"\\my-network\somelocation\aa\dd", @"\\my-network\somelocation\",@"\\my-network\\somelocation"}; foreach (string name in names) { if (Regex.IsMatch(name, pattern)) { Console.WriteLine(name); //Directory.Exists function to check if file exists } } 

亚历山大的答案+相对路径

亚历山大迄今为止的答案是最正确的,因为它支持文件名中的空格(即C:\Program Files (x86)\将匹配)…这也包括相对路径。

例如,您可以执行cd /cd \并执行相同的操作。

此外,如果您目前在C:\some\path\to\some\place并且键入了其中的任何一个命令,则最终会在C:\

更重要的是,你应该考虑以'/'开头的路径作为根路径(到当前驱动器)。

(?:[a-zA-Z]:(\|/)|file://|\\|.(/|\)|/) ([^,\/:*\?\<>\"\|]+(\|/){0,1})

然而,亚历山大的答案的修改版本,我们包括相对路径,没有领先/或驱动器号,以及/没有前导驱动器号(相对于当前驱动器作为根)。