c# - 从文件名可变的文件中提取日期

标签 c# .net regex

我有一系列文件,我正在尝试从文件名中解析日期。这是我当前尝试解析的文件的示例:

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.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

关于c# - 从文件名可变的文件中提取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31208746/

相关文章:

c# - 将 URI 路径转换为 ​​.NET 中的相对文件系统路径

java - 从正则表达式中转义完整路径的一部分,同时保留其中的一部分

c# - 与 Linq xxxOrDefault 的结果进行比较时,是否使用 default(string) 是一种常见的习惯用法?

c# - 您必须使用支持并启用JavaScript的浏览器-C#

c# - C# 中泛型的处理方式是否与 C++ 中的相同?

c# - 使用 CodeDOM 或 Mono - .NET

jquery - 使用 Javascript 解析 .NET 日期

c# - 用正则表达式拆分 CamelCase

java - java Matcher中的零星堆栈溢出错误

c# - 需要 4 GB 或 5 GB 数字的算法 - 这可能吗?