C# 使用正则表达式搜索带有时间戳的文件名

C# 使用正则表达式搜索带有时间戳的文件名,c#,regex,csv,C#,Regex,Csv,我有一个从指定文件夹读取文件的函数。它使用xml文件获取文件名及其路径。 当文件名为Finance.csv时,它工作正常,但现在要求更改,文件名有时间戳(Finance_May2016.csv),配置文件有以下内容 <filename>Finance_{Date:mmmYYYY}.csv <\filename> <Path> C:\folder <\Path> 因此,这里我从配置文件传递文件名和路径,并比较文件夹中是否有与配置文件中设置的名称和D

我有一个从指定文件夹读取文件的函数。它使用xml文件获取文件名及其路径。 当文件名为Finance.csv时,它工作正常,但现在要求更改,文件名有时间戳(Finance_May2016.csv),配置文件有以下内容

<filename>Finance_{Date:mmmYYYY}.csv <\filename>
<Path> C:\folder <\Path>
因此,这里我从配置文件传递文件名和路径,并比较文件夹中是否有与配置文件中设置的名称和
DateTime
格式匹配的文件。 到目前为止,它还可以工作,但是因为正则表达式是硬编码的,所以它只搜索
mmmYYYY
date格式,如果在配置文件中我设置了一个新的文件名格式,比如
{date:ddmmyyyy}\u Finance.csv
,该怎么办。当前的正则表达式不起作用

我的问题是,还有其他更优雅的方法来实现这一点吗?我试着用一些搜索模式过滤器使用
Directory.Getfiles()
,但没有成功


提前感谢您提供格式正常化后与.NET匹配的任何信息(例如,
mm
=>
mm
),请尝试将文件的最后一部分转换为给定格式的日期:

string mask   = "ddMMyyyy";
string egFile = "Finance_01052016.csv";

if (egFile.Length >= mask.Length) {
    string possibleDate = Path.GetFileNameWithoutExtension(egFile).Substring(mask.Length);

    DateTime dateTime;
    if (DateTime.TryParseExact(possibleDate, mask, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) {
        Console.Write("{0} is {1}", egFile, dateTime);
    }
}

从上面的代码中,您正在查找具有FinanceMMMyyyy.csv模式的文件。然后检索找到的第一个文件。下面的代码更具可读性。出于这个原因,我希望尽可能避免使用正则表达式

using System;
using System.IO;

var MONTH_CHARS = 3;
var YEAR_CHARS = 4;
var FILE_NAME = "Finance";

string filePattern = @"Finance*.csv";
string path = @"c:\temp\";



    foreach (var filePath in Directory.GetFiles(path, filePattern))
{
    var startIndex = FILE_NAME.Length;
    var fileName = Path.GetFileName(filePath);
    var month = fileName.Substring(startIndex, MONTH_CHARS);
    var year = fileName.Substring(startIndex + MONTH_CHARS, YEAR_CHARS);

    Console.WriteLine(fileName + "," + month + year);

    if (string.IsNullOrEmpty(month) || string.IsNullOrEmpty(year)) continue;

    //Check for proper month and year here

    resultingFileName = fileName;

    break;
}

Console.WriteLine(resultingFileName);
对于日期位于文件名开头的情况,可以执行以下操作:

 var MONTH_CHARS = 2;
 var YEAR_CHARS = 4;
 var FILE_NAME = "Finance";


 string filePattern = @"*Finance.csv";
 string path = @"c:\temp\";
 var resultingFileName = "";
 var startIndex = 0;

 foreach (var filePath in Directory.GetFiles(path, filePattern))
 {

     var fileName = Path.GetFileName(filePath);

     var year = fileName.Substring(startIndex , YEAR_CHARS);
     var month = fileName.Substring(YEAR_CHARS, MONTH_CHARS);
     var endingFileName = fileName.Substring(YEAR_CHARS + MONTH_CHARS);


     if (string.IsNullOrEmpty(month) || string.IsNullOrEmpty(year) || 
            string.IsNullOrEmpty(endingFileName)) continue;

     //Check for proper month and year here

     resultingFileName = fileName;

     break;
 }

 Console.WriteLine(resultingFileName);

您知道您的替换项包含正则表达式模式吗?您只需匹配
{…}
中的所有内容并获取日期,然后使用
DateTime.TryParse
对其进行解析。谢谢您的评论。请问你们有样品吗?。谢谢你的评论。我也不喜欢正则表达式。在这项新要求之前,这很容易。在配置管理器中,我有文件名及其路径,为了得到完整的路径,我将它们组合在一起。现在有了这个新的要求,我有了文件名和时间戳(即:Finance{Date:mmYYYY}.csv)。我不能再组合它们了,因为我必须先解析时间戳,然后检查文件夹中是否有文件与配置中设置的filaname匹配。如果在配置管理器中将filaname更改为{Date:yyyymm},会发生什么再次感谢Ernesto。很抱歉,我在评论中说时间戳可以在文件名周围移动。这就是我们引入配置文件的原因。在该文件中,用户可以指定名称和时间戳的位置。例如,今天用户只需要选择feb2015 Finance.csv。因此,他/她在配置文件中设置{Date:mmyyyy}Finance.csv。一周后,他/她需要财务{Date:mmyyyy}.csv。最终用户不是程序员。他们只是在配置文件中进行更改以将所需文件设置为可读。再次感谢Ernesto。感谢Alex的评论。如果在配置文件中,文件名更改为{Date:YYYYMM},会发生什么Finance.csv。因为用户可以在配置文件中进行更改,所以我需要选择正确的文件。今天可以是{Date:yyyymm}Finance.csv,但明天可以是Finance{Date:yyyymm}.csv,我只需要选择配置文件中指定的文件。谢谢。
 var MONTH_CHARS = 2;
 var YEAR_CHARS = 4;
 var FILE_NAME = "Finance";


 string filePattern = @"*Finance.csv";
 string path = @"c:\temp\";
 var resultingFileName = "";
 var startIndex = 0;

 foreach (var filePath in Directory.GetFiles(path, filePattern))
 {

     var fileName = Path.GetFileName(filePath);

     var year = fileName.Substring(startIndex , YEAR_CHARS);
     var month = fileName.Substring(YEAR_CHARS, MONTH_CHARS);
     var endingFileName = fileName.Substring(YEAR_CHARS + MONTH_CHARS);


     if (string.IsNullOrEmpty(month) || string.IsNullOrEmpty(year) || 
            string.IsNullOrEmpty(endingFileName)) continue;

     //Check for proper month and year here

     resultingFileName = fileName;

     break;
 }

 Console.WriteLine(resultingFileName);