代码之家  ›  专栏  ›  技术社区  ›  ssube

regex有条件地解析文件名和部分路径

  •  4
  • ssube  · 技术社区  · 14 年前

    我有一个C应用程序,它使用搜索功能查找目录中的所有文件,然后将它们显示在一个列表中。我需要能够根据扩展名过滤文件(可以使用搜索功能) 目录(例如,阻止“test”或“debug”目录中的任何一个显示)。

    我当前的代码是这样的:

    Regex filter = new Regex(@"^docs\(?!debug\)(?'display'.*)\.(txt|rtf)");
    String[] filelist = Directory.GetFiles("docs\\", "*", SearchOption.AllDirectories);
    foreach ( String file in filelist )
    {
        Match m = filter.Match(file);
        if ( m.Success )
        {
            listControl.Items.Add(m.Groups["display"]);
        }
    }
    

    (这在某种程度上简化和合并了,实际的regex是从一个文件中读取的字符串创建的,我在这两者之间做了更多的错误检查。)

    我需要能够选择一个节(通常是相对路径和文件名)作为显示名,而忽略任何具有特定文件夹名作为其路径节的文件。例如,对于这些文件,只有带+s的文件才应匹配:

    + docs\info.txt
    - docs\data.dat
    - docs\debug\info.txt
    + docs\world\info.txt
    + docs\world\pictures.rtf
    - docs\world\debug\symbols.rtf
    

    我的regex适用于大多数情况,但我不知道如何使它在最后一个文件中失败。有什么关于如何使这个工作的建议吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Tim Pietzcker    14 年前
    ^docs\\(?:(?!\bdebug\\).)*\.(?:txt|rtf)$
    

    将匹配一个字符串

    1. 从开始 docs\ ,
    2. 不包含 debug\ 任何地方 \b 锚确保我们匹配 debug 作为一个完整的词),以及
    3. 以结束 .txt .rtf .
        2
  •  3
  •   SwDevMan81 Chris Barlow    14 年前

    尝试 Directory.GetFiles . 这应该是你想要的。

    例子:

    // Only get files that end in ".txt"
    string[] dirs = Directory.GetFiles(@"c:\", "*.txt", SearchOption.AllDirectories);
    Console.WriteLine("The number of files ending with .txt is {0}.", dirs.Length);
    foreach (string dir in dirs) 
    {
       Console.WriteLine(dir);
    }