从文件名中提取日期

我有一种情况需要从文件名中提取日期,文件名的一般模式是[filename_]YYYYMMDD[.fileExtension]

例如“xxx_20100326.xls”x2v_20100326.csv

以下程序完成了工作

 //Number of charecter in the substring is set to 8 //since the length of YYYYMMDD is 8 public static string ExtractDatesFromFileNames(string fileName) { return fileName.Substring(fileName.IndexOf("_") + 1, 8); } 

有没有更好的选择来达到同样的目标?

我基本上是在寻找标准练习。

我使用的是C#3.0和dotnet framework 3.5

编辑:

我喜欢LC的解决方案和方法。 我用过他的程序

 string regExPattern = "^(?:.*_)?([0-9]{4})([0-9]{2})([0-9]{2})(?:\\..*)?$"; string result = Regex.Match(fileName, @regExPattern).Groups[1].Value; 

该函数的输入是: “x2v_20100326.csv”

但输出是: 2010而不是20100326 (这是预期的一个)。

谁能请帮忙。

我会使用正则表达式, 特别是如果文件名中有多个下划线可能 。 然后,您可以捕获年,月,日并在必要时返回DateTime 。 这样,您可以确保提取文件名的正确部分,它确实与您正在搜索的模式匹配。

对于模式[filename_]YYYYMMDD[.fileExtension] ,我想的是:

 ^(?:.*_)?([0-9]{4})([0-9]{2})([0-9]{2})(?:\..*)?$ 

然后,按照该顺序,您捕获的组将分别为年,月和日。

说明:

^ :字符串的开头。

(?:.*_)? :可选的非捕获组,包含任意数量的字符,后跟下划线。

([0-9]{4}) :包含正好四位数的捕获组。

([0-9]{2}) :包含正好两位数的捕获组。

(?:\..*)? :可选的非捕获组,包含一个点后跟任意数量的字符。

$ :字符串的结尾。

但是,我要补充一点,如果您确定您的文件名只有一个且只有一个下划线,并且日期跟随下划线,那么您拥有的代码更清晰,可能会比正则表达式略快。 根据预期的输入集,要记住这一点。

只要您确定输入是标准格式,您拥有的代码就足够了。 如果有可能它不会那么你应该为没有下划线的场景添加一些error handling,或者天数/月没有用2位数表示(这会弄乱8个字符的子串数),其次是一个DateTime.TryParse以确保它是一个真实的日期。

您的其他选择是:

  • 正则表达式 :这种明确定义的模式过度杀伤。
  • LINQ :使用SkipWhileSkipTakeWhile方法忽略下划线并捕获数字,直到遇到句点。 此查询最终看起来令人困惑,结果需要转换为字符串。
  • String.Split :拆分为{ '_', '.' } 并使用表示日期的数组元素。

这些选项都不会产生比您已经拥有的代码更清晰的代码,性能可能不会更好。

你得到的代码很好,除了你可能想要检查IndexOf的返回值,以防你遇到没有_的文件,即。

  int index = fileName.IndexOf("_"); if (index != -1) return fileName.Substring(index + 1, 8); else ... 

如果要检查它是否是有效日期,则可以调用DateTime.TryParseExact