正则表达式检查文件格式是否与C#中的预期一致

时间:2016-06-29 09:36:15

标签: c# regex

我的输入是一个包含完整路径的文件名列表,我只需要提取其文件名严格适合以下文件名格式的项目。

通用文件名格式。

 **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$"

如果我遗失了某些内容,请告诉我。

8 个答案:

答案 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

它开始检查文件名之前的反斜杠,然后它是非常基本的匹配。

See it here at regex101

答案 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();