C# - Regex - 根据特定的命名模式匹配文件名

时间:2009-10-21 14:35:18

标签: c# regex

我有一个应用程序需要查找并处理遵循非常具体的命名约定的文件,如下所示。

IABC_12345-0_YYYYMMDD_YYYYMMDD_HHMMSS.zip

我无法使用搜索模式看到任何简单的方法,所以我假设在使用更简单的通配符模式生成文件列表后,我必须执行类似的操作。

RegEx re = new RegEx("blah");

foreach(FileInfo fi in Directory.GetFiles(path, "I*.zip"))
{
    if(re.IsMatch(fi.Name))
       //blah blah blah
}

这是执行此操作的最佳方式吗?如果是这样,我将如何形成正则表达式以匹配此文件格式?

4 个答案:

答案 0 :(得分:17)

    string pattern = @"I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip";
    var matches = Directory.GetFiles(@"c:\temp")
        .Where(path => Regex.Match(path, pattern).Success);

    foreach (string file in matches)
        Console.WriteLine(file); // do something

答案 1 :(得分:7)

这取决于您希望匹配这些名称的具体方式。这是否足够具体:

I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip

说明:

I             // match an 'I'
[A-Z]{3}      // followed by three upper case letters
_             // followed by an underscore
\d{5}         // followed by five digits
-             // followed by a hyphen
\d            // followed by a single digit
_             // followed by an underscore
\d{8}         // followed by eight digits
_             // followed by an underscore
\d{8}         // followed by eight digits
_             // followed by an underscore
\d{6}         // followed by six digits
\.zip         // followed by '.zip'

但是,如果您的文件名称包含无效的日期或时间,则实际上不能单独使用regex,尤其是DATE_DATE部分指定日期范围时。您将必须匹配I(和其他)向您显示的所有文件名,然后执行一些“常规”编程逻辑来过滤掉无效的文件名。

答案 2 :(得分:2)

对于一个简单的正则表达式,它也会匹配无效的时间规范(即小时= 73等),你可以使用这样的东西:

^I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip$

答案 3 :(得分:0)

RegexBuddy是一个花几块钱的好方法(如果你有一些花钱)。它将帮助您开发,测试和调试您的正则表达式。它甚至可以为您创建代码片段。

RegexMagic(来自同一作者)甚至可以为您提供更多帮助:它可以帮助您从样本创建正则表达式模式。 (我没试过,所以我不能说它是否好)。