2015-07-03 117 views
2

我有一系列文件,我试图解析文件名中的日期。下面是我目前试图解析文件的例子:从文件名可变的文件中提取日期

AC SCR063_6.8.15.xlsx 
AC SCR064_6.22.15_REVISED.xlsx 
AccentCare July 2015 Rent Report 06.26.15 Final.xlsx 
AccentCare June 2015 Rent Report 05.26.15 Final.xlsx 

在这些文件中,日期很可能会一直处于DD.MM.YY或DD.MM.YYYY的格式。我试图设计一个正则表达式匹配字符串中的这些日期而据我已经得到如:

^(\d{1,2})\.(\d{1,2})\.(\d{2,4})$ 

但由于在文件名中的多变性和我有限的正则表达式的知识,我不知道我需要做什么才能使这个正则表达式匹配所有这些文件名称的情况。我需要在正则表达式的日期部分之前创建一个可选捕获组,以匹配处理它的任何事件以及之后的可选捕获组,以排除Final.xlsx或_REVISED.xlsx等内容?

编辑:我也应该注意到这些文件名也会有字符串中的进行路径信息,我会评估,虽然我相信我可以得到直接文件名的另一种方式,如果它会更容易评估字符串办法。编辑2:期望的输出将是6.8.15或06.26.15等,只是dd.mm.yy格式的日期部分。这样我可以在我的应用程序中将它投射到日期时间。

+0

什么是你想要的输出? – hungndv

+0

@hungndv请看我编辑 – Delete

+0

Fyi,你的格式不是'dd.mm.yyyy.',而是'MM.dd.yyyy.' –

回答

2

所以允许的格式是M.d.yyyyM.d.yy(不dd.mm.yyyy的说明),我会用DateTime.TryParseExact。例如这个LINQ查询:

var fileNames = new string[] { "AC SCR063_6.8.15.xlsx", "AC SCR064_6.22.15_REVISED.xlsx", "AccentCare July 2015 Rent Report 06.26.15 Final.xlsx", "AccentCare June 2015 Rent Report 05.26.15 Final.xlsx" }; 
string[] allowedFormats = { "M.d.yyyy", "M.d.yy" }; 
DateTime[] dates = fileNames 
    .Select(fn => Path.GetFileNameWithoutExtension(fn).Split(' ', '_')) 
    .Select(arr => arr.Select(s => s.TryGetDateTime(null, allowedFormats)) 
         .FirstOrDefault(dt => dt.HasValue)) 
    .Where(nullableDate => nullableDate.HasValue) 
    .Select(nullableDate => nullableDate.Value) 
    .ToArray(); 

使用这种方便的扩展方法来解析字符串DateTime?

public static DateTime? TryGetDateTime(this string item, DateTimeFormatInfo dfi, params string[] allowedFormats) 
{ 
    if (dfi == null) dfi = DateTimeFormatInfo.InvariantInfo; 
    DateTime dt; 
    bool success = DateTime.TryParseExact(item, allowedFormats, dfi, DateTimeStyles.None, out dt); 
    if (success) return dt; 
    return null; 
} 

结果是:

08.06.2015 00:00:00 System.DateTime 
22.06.2015 00:00:00 System.DateTime 
26.06.2015 00:00:00 System.DateTime 
26.05.2015 00:00:00 System.DateTime 
+0

我对格式的错误,但是这似乎工作得非常好。非常感谢你。 – Delete

2

这大致看起来是正确的,但你有一个开始行和行结束检查你的正则表达式(^开头和$结束)。

试试这个:(\ d {1,2})(\ d {1,2})(\ d {2,4})

+2

这个正则表达式也会匹配'1.2.123'的值。不确定是否有预期。 –

+0

但是,如果你有像这样的行:“000a95.6.153a9 Final.xlsx” – Fabjan