我有一系列文件,我正在尝试从文件名中解析日期。这是我当前尝试解析的文件的示例:
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 格式的日期部分。这样我就可以将其转换为我的应用程序中的日期时间。
最佳答案
因此允许的格式是 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
关于c# - 从文件名可变的文件中提取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31208746/