匹配合法的包含空格的 Windows 绝对目录的正则表达式

7

我希望能够提供一个正则表达式,用于匹配有效的绝对Windows目录路径,其中目录名称可以包含空格。

示例匹配:

C:\pictures\holiday  (without trailing backslash)
C:\pictures\holiday\ (or with trailing backslash)
C:\ pictures\holiday
C:\ pictures\holiday\
C:\pictures \ holiday
C:\pictures \ holiday\
C:\pictures\ holiday \

示例失败:

\pictures\holiday (no relative path allowed)
C:\pictures*\holiday (not a valid directory path)

我尝试了^[a-zA-Z]:(\\\w+)*([\\])?$,但这并不匹配空格。
我还尝试过^[a-zA-Z]:(\s)*(\\\w+)*(\s)*([\\])?$,但它的工作不稳定。
正则表达式是我的最后一招。我也试图使用非正则表达式的方法来验证文本框,就像这个答案中所述。但我没有找到适用于空格的方法。
提前谢谢!

3
为什么 C:\pictures@!#$1afaf\holiday 不是有效的目录?我应该可以创建这样的目录。 - Avinash Raj
3
为什么“C:\pictures\holiday\photo.jpg”不是有效的目录路径?我可以将一个目录命名为“photo.jpg”。目录和文件名的接受模式没有区别,因为它们都是“文件”,只是具有不同的属性。 - Brian Stephens
1
如果用户在自己的机器上指定位置,则不会有威胁。如果路径数据不会传输到你的机器,为什么要担心?如果用户指定要上传的文件/文件夹位置,则程序中读取文件的部分会发出警报。而且文件阅读器将处理更多情况(如点、网络路径等)。 - Paddy
1
我知道那种感觉。我们已经接近建造核聚变反应堆了,已经50年了。 - Paddy
1
我找到了一个更好的解决方案,不需要使用正则表达式。解决方案是使用改进的文件夹浏览器,即Windows 7浏览器。安装Windows 7 API Code Pack。在Visual Studio 2013中,可以通过转到“工具->库包管理器->包管理器控制台”并运行命令“Install-Package Windows7APICodePack-Shell”来完成此操作。然后,您将可以访问Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog,其中包含所有验证! SHAZAM!! - InvalidBrainException
显示剩余6条评论
3个回答

14
这是一个可行的正则表达式: ^[a-zA-Z]:\\(((?![<>:"/\\|?*]).)+((?<![ .])\\)?)*$ 它使路径符合 NTFS 标准(请参阅 MSDN 规范)。我将对其进行分解: ^[a-zA-Z]:\\ 匹配单个驱动器号,带有冒号和反斜杠 (?![<>:"/\\|?*]) 是一个负向前瞻,以确保下一个字符无效 ((?![<>:"/\\|?*]).)+ 包装了该前瞻,接着是下一个字符,任意次数 (?<![ .])\\ 是一个负向后顾,以确保文件/目录不以空格或句点结尾。请注意:后顾 还没有完全实现
所有这些都可以重复0到多次,最后一个反斜杠是可选的。
对于许多用例,最好将路径长度限制为256个字符。为此,请将*替换为{0,256}编辑:允许根目录。

当我把它放在字符串文字中时,Visual Studio不喜欢它并将其标记为红色。为了确保字符在复制粘贴过程中没有被更改,我手动输入了那个东西,但它仍然被标记为错误。Match match = Regex.Match(tbOutputFilePath.Text, @"^[a-zA-Z]:\\(((?![<>:"/\\|?*]).)*[^ ]\\)*((?![<>:"/\\|?*]).)*[^ ]\\?$"); - InvalidBrainException
啊,我想我应该在字符串文字中用另一个双引号转义双引号,就像这个答案https://dev59.com/7HI-5IYBdhLWcg3wSGQB所建议的一样。 - InvalidBrainException
我还修改了我的答案,因为我意识到它允许反斜杠之前的非法字符。现在最后一个字符必须匹配前瞻并且具有确保其不是空格或句号的回顾。 - Brian Stephens
1
好的,我已经转义了双引号,这是生成的正则表达式: @"^[a-zA-Z]:\\(((?![<>:""/\\|?*]).)*[^ ]\\)*((?![<>:""/\\|?*]).)*[^ ]\\?$"它不能匹配包含空格并且有多个级别的目录,也不能匹配根目录。例如,它不能匹配 C:\ 或 C:\ pictures \ vacation \(我认为它破坏了评论框,因为我不能再用灰色背景包裹这些路径了!)xD - InvalidBrainException
我修复了它以允许根目录,并意识到我不需要重复模式来匹配路径的最后一级。它故意不匹配 "C:\pictures ",因为规范规定文件/目录不能以空格或句点结尾。 - Brian Stephens
显示剩余3条评论

1

以下正则表达式适用于我验证自定义规则与类似路径的字符串。

/^[a-z]:(((\|/)[a-z0-9\s_@-^!#$%&+={}[]]+)+(\|/)?)$/i

var path="C:\\backup\\newFolder" ; // valid
// var path="C:\\backup\\newFolder\\" ; // valid
// var path="C:\/backup\/newFolder\\" ; // valid
// var path="C:\\\backup\newFolder" ; // invalid
// var path="C:\backup//\newFolder" ; // invalid
// var path="C:\backup\new..Folder" ; // invalid


if((/^[a-z]:(((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+(\\|\/)?)$/i.test(path))) {
    alert("valid path string");
} else {
    alert("Invalid Path String");
}


0
function isFileOrFolderPathValid(path)
{
    var result =  new RegExp(/^[a-z]:((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+\.[a-zA-Z0-9]+$/i).test(path);

    if (result === true) return true;

    result = new RegExp(/^[a-z]:((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+$/i).test(path);    

    //result = /^[a-zA-Z]:\\(\w+\\)*\w*$/.test(path);

    return result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接