C#-文件路径的Regex,例如C: est est.exe

本文关键字:est 例如 exe 文件 路径 Regex C#- | 更新日期: 2023-09-27 17:59:33

我目前正在寻找一个正则表达式,它可以帮助验证文件路径,例如:

C:'test'test2'test.exe

C#-文件路径的Regex,例如C:	est	est.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,如果路径太长,则会引发其他异常,等等。这将处理所有规则,而Regex很难纠正这些规则。

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

(^([a-z]|[A-Z]):(?=''(?!['0-'37<>:"/''|?*])|'/(?!['0-'37<>:"/''|?*])|$)|^''(?=['''/][^'0-'37<>:"/''|?*]+)|^(?=(''|'/)$)|^'.(?=(''|'/)$)|^'.'.(?=(''|'/)$)|^(?=(''|'/)[^'0-'37<>:"/''|?*]+)|^'.(?=(''|'/)[^'0-'37<>:"/''|?*]+)|^'.'.(?=(''|'/)[^'0-'37<>:"/''|?*]+))((''|'/)[^'0-'37<>:"/''|?*]+|(''|'/)$)*()$

这是针对UNIX/Linux路径

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

以下是我的测试:

Win Regex

Unix Regex

这些与Javascript配合使用

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

编辑2我为unix添加了以波浪号开头的路径,(~/,~,~/什么的)

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

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

在Windows和Linux支持下尝试这个:((?:[a-zA-Z]':){0,1}(?:[''/]['w.]+){1,})

我使用此正则表达式捕获窗口中的有效文件/文件夹路径(包括UNCs和%variables%),但不包括"C:''"或"''''serverName"等根路径

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

该正则表达式与路径元素中的前导空格不匹配,因此

  • "C:''program files"匹配
  • "C:''pathWithLeadingSpace"不匹配

任何级别的都允许变量

  • "%program files%"匹配
  • "C:''my path with internal spaces''%my var with internal space%"匹配
regex CmdPrompt("^([A-Z]:[^'<'>':'"'|'?'*]+)");

基本上,我们寻找所有不在禁止的Windows路径字符列表中的东西:

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

我知道这真的很旧。。。但在@agent-j的响应基础上,我添加了命名组,并支持句点字符。

^(?<ParentPath>(?:[a-zA-Z]':|''''['w's'.]+''['w's'.$]+)''(?:['w's'.]+'')*)(?<BaseName>['w's'.]*?)$

我已将其保存在Regexr

我发现这里的大多数答案都有点偶然。

不过在这里找到了一个很好的解决方案:

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
 }
}   

Alexander的答案+相对路径

Alexander拥有迄今为止最正确的答案,因为它支持文件名中的空格(即C:'Program Files (x86)'将匹配)。。。这也旨在包括相对路径。

例如,您可以执行cd /cd ',它也可以执行相同的操作。

此外,如果您当前在C:'some'path'to'some'place中,并且您键入了这两个命令中的任何一个,那么您最终会进入C:'

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

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

然而,在Alexander答案的修改版本中,我们包括了没有前导/或驱动器号的相对路径,以及没有前导驱动器号的/(相对于作为根的当前驱动器)。

相关文章: