我有一种情况需要从文件名中提取日期,文件名的一般模式是 [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 框架 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})
:一个包含两个数字的捕获组。
(?:\..*)?
:一个可选的非捕获组,包含一个点后跟任意数量的字符。
$
:字符串的结尾。
但是,我要补充一点,如果您确定您的文件名只有一个下划线,并且日期跟在下划线之后,那么您的代码会更简洁,并且可能比正则表达式稍微快一些。根据预期的输入集,需要牢记这一点。
关于c# - 从文件名中提取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3042331/