我的输入是一个包含完整路径的文件名列表,我只需要提取其文件名严格适合以下文件名格式的项目。
通用文件名格式。
**c:\My\Path\To\File\fileName_YYYY-MM-DD_HH-MM-SS.ext**
我试过跟随正则表达式,但我仍然看到一些噪音。
string regexPattern = @"fileName_[2-9][0-9]{3}-[0-1][0-9]-[0-3][0-9]_[0-2][0-9]-[0-5][0-9]-[0-5][0-9]\.ext$"
如果我遗失了某些内容,请告诉我。
答案 0 :(得分:3)
为什么在使用DateTime
内置解析器时可以使用正则表达式:
string input = c:\My\Path\To\File\fileName_YYYY-MM-DD_HH-MM-SS.ext;
string filename = Path.GetFilenameWithoutExtension(input);
string[] parts = filename.Split('_');
if (parts.Length != 3) { /*Invalid*/ }
if (Path.GetExtension(input) != "ext") { /*Invalid*/ }
if (parts[0] != "filename") { /*Invalid*/ }
DateTime dt;
if (!DateTime.TryParseExact(parts[1] + "_" + parts[2], "yyyy-MM-dd_HH-mm-ss",
CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{ /*Invalid*/ }
//IsValid
答案 1 :(得分:2)
创建正则表达式以验证Date
是一件非常重要的事情,想象一下闰年。为什么不只是验证扩展名,前缀和后缀?
验证后缀时,使用DateTime.TryParse
非常方便:
String path = @"c:\My\Path\To\File\fileName_2016-02-29_23-56-59.ext";
// extension ".ext"
String ext = Path.GetExtension(fileName);
// file name - "fileName_2016-02-29_23-56-59"
String fileName = Path.GetFileNameWithoutExtension(path);
// filename prefix "filename"
String prefix = fileName.Substring(0, fileName.IndexOf('_'));
// filename suffix "2016-02-29_23-56-59"
String suffix = fileName.Substring(fileName.IndexOf('_') + 1);
DateTime dt;
bool valid = ext.Equals(".ext", StringComparison.InvariantCultureIgnoreCase) &&
prefix.Equals("fileName") &&
DateTime.TryParseExact(suffix,
"yyyy-MM-dd_HH-mm-ss",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out dt);
答案 2 :(得分:0)
你可以去:
fileName_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}\.ext$
请参阅a demo on regex101.com 这适用于:
fileName_1234-12-12_12-12.ext
fileName_1234-12-12_12-12.ext2 (bad extension)
fileName_1234-12-12_12-1234.ext (longer numbers)
/fileName_1234-12-12_12-12.ext/anythingelse (not at the right place)
答案 3 :(得分:0)
这是你在寻找什么?
string regexPattern = @"\\filename_[2-9]\d{3}-[0-1]\d-[0-3]\d_[0-2]\d-[0-5]\d-[0-5]\d\.ext$"
为了回答评论而做出了更改,谢谢。
答案 4 :(得分:0)
我没有看到检查文件名不以垃圾开头的解决方案。这是我的镜头:
\\\w+_[2-9]\d{3}-[0-1]\d-[0-3]\d_[0-2]\d-[0-5]\d-[0-5]\d\.ext
它开始检查文件名之前的反斜杠,然后它是非常基本的匹配。
答案 5 :(得分:0)
您确定您的REGEX写得正确吗?您指定的格式为:**c:\My\Path\To\File\fileName_YYYY-MM-DD_HH-MM-SS.ext**
,而您检查的表达式为:@"filename[2-9][0-9]{3}-[0-1][0-9]-[0-3][0-9]_[0-2][0-9]-[0-5][0-9]-[0-5][0-9].ext$"
似乎你缺少一个下划线。
否则乍一看表达似乎是正确的。
答案 6 :(得分:0)
这里流了很多答案......但是它们似乎都不完整。
String path = @"c:\My\Path\To\File\fileName_YYYY-MM-DD_HH-MM-SS.ext"
String filename = new FileInfo(path).Name
String regexPattern = @"^filename_[2-9]\d{3}-[0-1]\d-[0-3]\d_[0-2]\d-[0-5]\d-[0-5]\d\.ext$"
Boolean isMatch = Regex.IsMatch(filename, regexPattern, RegexOptions.IgnoreCase);
应该涵盖所有内容。
答案 7 :(得分:0)
对于那些不喜欢在这种情况下使用Regex的人,我想分享DateTime.TryParseExact函数的不同行为。
Func<string, string, bool> CheckFileFormat = (fileName, fileMask) =>
{
DateTime parsedFileDate;
return DateTime.TryParseExact(fileName, fileMask, null, System.Globalization.DateTimeStyles.None, out parsedFileDate);
};
string FileNameFormat = "'My_File_Name_'yyyy-MM-dd_HH-mm-ss'.csv'";
string FileName = "My_File_Name_2017-10-11_15-46-16.csv";
if (CheckFileFormat(FileName,FileNameFormat))
{
Console.WriteLine($"file matches");
}
else
{
Console.WriteLine("no match!");
}
Console.ReadLine();