Regex 正则表达式以匹配包含空格的有效绝对Windows目录

Regex 正则表达式以匹配包含空格的有效绝对Windows目录,regex,Regex,我想要一个正则表达式来匹配有效的绝对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\ h

我想要一个正则表达式来匹配有效的绝对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)
示例失败:

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)*([\\])?$
,但效果不稳定

正则表达式是我最后的选择。我还尝试使用非正则表达式解决方案验证文本框,如中所示。但我还没有找到一种适用于空间的方法


提前谢谢

这里有一个可以工作的正则表达式:

^[a-zA-Z]:\\(((?![:“/\\\\;?*))+(?)

它使路径符合NTFS标准(请参阅)。我将对其进行分解:

^[a-zA-Z]:\\
匹配单个驱动器号,带有冒号和反斜杠

(?![:“/\\\\\;?*])
是一个负前瞻,以确保下一个字符不无效

((?![:“/\\\\\;?*])+
可以多次包装前一个字符,后跟下一个字符

(?是一个负查找,以确保文件/目录不以空格或句点结尾。请注意:Lookbehinds

所有这些都会重复0到多次,最后一个反斜杠是可选的

对于许多人来说,最好将路径长度限制为256个字符。为此,请将
*
替换为
{0256}


编辑:允许根目录

下面的正则表达式对我来说可以根据类似于字符串的路径验证自定义规则

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;
}
/^[a-z]:((\\\\\/)[a-z0-9\s\@-^!\$%&+={}[]+)+(\\\\/)?)$/i

var path=“C:\\backup\\newFolder”;//有效
//var path=“C:\\backup\\newFolder\\”;//有效
//var path=“C:\/backup\/newFolder\\”;//有效
//var path=“C:\\\backup\newFolder”;//无效
//var path=“C:\backup//\newFolder”;//无效
//var path=“C:\backup\new..Folder”;//无效
如果(/^[a-z]:((\\\\\/)[a-z0-9\s\\-^!\$%&+={}\[\]++)+(\\\\\/)?)$/i.test(路径))){
警报(“有效路径字符串”);
}否则{
警报(“无效路径字符串”);

}
为什么它
C:\pictures@!#$1afaf\holiday
不是有效的目录?我可以创建这样的目录。为什么“C:\pictures\holiday\photo.jpg”不是有效的目录路径?我可以将目录命名为“photo.jpg”。目录和文件名的接受模式没有区别,因为它们都是“文件”“,只是具有不同的属性。如果用户在自己的计算机上指定位置,则不会受到威胁。如果路径数据没有到达您的计算机,您为什么会担心?如果用户指定要上载的文件/文件夹位置,则程序的文件读取部分仍会投诉。并且文件读取器将处理更多情况。”(如点、网络路径等)我知道这种感觉。我们离建造核聚变反应堆已经很近了。50年来,我找到了一个不需要正则表达式的更好的解决方案。解决方案是使用改进的文件夹浏览器,即Windows 7浏览器。安装Windows 7 API代码包。在Visual Studio 2013中,这可以通过转到ols->Library Package Manager->Package Manager Console
并运行命令
安装程序包Windows7APICodePack Shell
。然后您将可以访问
Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog
,其中包括所有验证!SHAZAM!!当我将其放在字符串文本中时,Visual Studio不会为了确保在复制粘贴过程中字符没有被更改,我手工输入了那个东西,但它仍然将它标记为错误。
Match Match=Regex.Match(tbOutputFilePath.Text,@“^[a-zA-Z]:\\(((!![:“/\\\\\\\;?*])*(((![:“/\\\\\\\\\\\\;?*])*(((!![:“/\\\\\\\\\\\\\;?*)))*)*)*(((!!![:“/\ \ \ \ \ \ \ \ \ \ \?))))*)*)*)
你需要转义正则表达式中的双引号,不是一个C#string文本应该自动转义吗?啊,我想我应该用另一个双引号转义双引号,即使是在字符串文本中,正如这个答案中所建议的,我还修改了我的答案,因为我意识到反斜杠之前允许使用非法字符。Th最后一个字符现在必须匹配前向和后向,以确保它不是空格或句点。