【问题标题】:Regex to parse out filename and partial path, conditionally正则表达式有条件地解析出文件名和部分路径
【发布时间】:2011-04-09 12:12:35
【问题描述】:

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

我当前的代码是这样的:

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"]);
    }
}

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

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

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

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

【问题讨论】:

  • 您的正则表达式中似乎仍有拼写错误:您需要转义反斜杠 (`\`) 否则它们会将您的前瞻括号转义为文字括号。

标签: c# regex search .net-2.0


【解决方案1】:

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

【讨论】:

  • 这就是我正在使用的函数,实际上(代码示例中的错字)。我的问题是它不会过滤掉该目录中“坏”子目录中的文件。我还需要将过滤器保存在一个文件中(尽管也可以使用 GetFiles 来完成)。
【解决方案2】:
^docs\\(?:(?!\bdebug\\).)*\.(?:txt|rtf)$

将匹配一个字符串

  1. docs\开头,
  2. 在任何地方都不包含debug\\b 锚确保我们将debug 匹配为一个完整的单词),并且
  3. .txt.rtf 结尾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2018-12-07
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多