正则表达式有条件地解析文件名和部分路径

时间:2010-09-08 01:44:44

标签: c# regex search .net-2.0

我有一个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"]);
    }
}

(这有点简化和整合,实际的正则表达式是从一个从文件中读取的字符串创建的,我在其间做了更多的错误检查。)

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

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

我的正则表达式适用于大多数人,除了我不知道如何使它在最后一个文件上失败。关于如何使这项工作的任何建议?

2 个答案:

答案 0 :(得分:3)

试试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);
}

答案 1 :(得分:2)

^docs\\(?:(?!\bdebug\\).)*\.(?:txt|rtf)$

将匹配

的字符串
  1. docs\
  2. 开头
  3. 在任何地方都不包含debug\\b锚定确保我们将debug与整个单词匹配),
  4. .txt.rtf结尾。