我遇到一种情况,我需要从文件名中提取日期,其一般模式是[filename_]YYYYMMDD[.fileExtension]
e.g. “xxx_20100326.xls” or 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
Edit:
我喜欢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})
:仅包含两位数字的捕获组。
(?:\..*)?
:可选的非捕获组,包含一个点后跟任意数量的字符。
$
: 字符串的末尾。
但是,我要补充一点,如果您确定您的文件名有一个且只有一个下划线,并且日期位于该下划线之后,那么您的代码会更干净,并且可能会比正则表达式稍微快一些。根据预期的输入集,需要记住这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)