C#-文件路径的Regex,例如C: est est.exe
本文关键字:est 例如 exe 文件 路径 Regex C#- | 更新日期: 2023-09-27 17:59:33
我目前正在寻找一个正则表达式,它可以帮助验证文件路径,例如:
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
,如果路径太长,则会引发其他异常,等等。这将处理所有规则,而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答案的修改版本中,我们包括了没有前导/
或驱动器号的相对路径,以及没有前导驱动器号的/
(相对于作为根的当前驱动器)。