我有一系列文件,我试图解析文件名之外的日期。以下是我当前尝试解析的文件示例:
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 :(得分:2)
大致看起来是正确的,但是您的正则表达式中有一行和行尾检查(开头为^
,末尾为$
。
试试这个:(\d{1,2})\.(\d{1,2})\.(\d{2,4})
答案 1 :(得分:2)
因此,允许的格式为M.d.yyyy
和M.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
答案 2 :(得分:0)