我目前正在寻找一个正则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\.]+%+)*)
这个正则表达式不匹配路径元素中的前导空格,所以
变量在任何级别都是允许的
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)
我发现这里的大部分答案都是一个小小的失误。
在这里找到一个很好的解决方案
注意* – 这只适用于网络共享 – 不是本地文件
回答:
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})
然而,亚历山大的答案的修改版本,我们包括相对路径,没有领先/
或驱动器号,以及/
没有前导驱动器号(相对于当前驱动器作为根)。