如何修改此正则表达式,使其仅匹配目录而排除文件?

时间:2019-08-28 02:59:56

标签: c# regex

这是正则表达式模式: ^\D:(\\\w.+(\\?))+$

〇理想匹配(预期):
C:\ folder1 \ folder2
C:\ folder1 \ folder2 \

✖但它也匹配(实际):
C:\ folder1 \ folder2 \ file1.txt
C:\ folder1 \ folder2 \ file2.docx

问题(以便与OP标题匹配):
我应该如何更改此正则表达式,使其包含上述文件示例中提到的文件?

OR

子问题: 您对使用Regex有什么建议吗?请参阅下面的详细信息。

详细场景:
在我的WinForms应用程序中,我有一个TextBox,其中它的值是从配置文件中加载的。值可以是任何值-整数,字符串甚至目录。如果它看起来像目录(这就是我使用正则表达式的原因),那么我想使用System.IO.Directory.Exist()来验证此值。

3 个答案:

答案 0 :(得分:2)

我的猜测是,也许您正在尝试编写类似于以下内容的表达式:

^\D:(\\\w+\\\w+(\\?))$ 

也许不是,我不太确定。

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"^\D:(\\\w+\\\w+(\\?))$";
        string input = @"C:\folder1\folder2
C:\folder1\folder2\
C:\folder1\folder2\file1.txt
C:\folder1\folder2\file2.docx

";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

  

如果您想探索/简化/修改表达式,可以   在右上角的面板上进行了说明   regex101.com。如果您愿意,   也可以在this link中观看它的匹配方式   针对一些样本输入。


RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:1)

由于file1.txtfile2.docx都是有效的文件夹名称,因此更好的方法是进行简单的正则表达式检查:

(?i)^[A-Z]:\\

如果输入字符串与此正则表达式匹配,我们认为输入字符串是文件系统路径,然后您可以尝试/捕获System.IO.Directory.Exist()以实际检查是否 提供的路径是现有目录。

答案 2 :(得分:0)

您的正则表达式:

^\D:(\\\w+(\\?))+$

没有文件,它将采取任何路径。

示例结果:

Accepted > D:\Folder1\Folder2
Accepted > D:\Folder1\Folder2\
Not Accepted > D:\Folder1\Folder2\text.txt
Accepted > D:\Folder1\Folder2\Folder3
Accepted > D:\Folder1\Folder2\Folder3\

并带有更多文件夹,如示例所示。

要包含文件,只需添加.*,如下所示:

^\D:(\\\w+(\\?)).*没有任何特定的文件夹名称,这是无效的,因为仅使用此.*,您也会得到相同的结果。

^\D:(\\A\\).*,其中包含第一个特定的文件夹名称以及任何文件夹名称和文件。

^\D:\\\w+\\\w+\\?\w+.\..*带有2个文件夹,然后必须跟随文件。

模拟Here Regex101

切换正则表达式版本以查看其他模式,或复制粘贴正则表达式以进行测试。