Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Regex检查文件格式是否符合C中的预期#_C#_Regex - Fatal编程技术网

C# Regex检查文件格式是否符合C中的预期#

C# Regex检查文件格式是否符合C中的预期#,c#,regex,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$" 如果我遗漏了什

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

通用文件名格式

 **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$"
如果我遗漏了什么,请告诉我。

您可以选择:

fileName_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}\.ext$
请参阅。
这将有助于:

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)

这就是你要找的吗

string regexPattern = @"\\filename_[2-9]\d{3}-[0-1]\d-[0-3]\d_[0-2]\d-[0-5]\d-[0-5]\d\.ext$"


已对回复评论进行了更改,谢谢。

我没有看到检查文件名是否以垃圾开头的解决方案。以下是我的拍摄:

\\\w+_[2-9]\d{3}-[0-1]\d-[0-3]\d_[0-2]\d-[0-5]\d-[0-5]\d\.ext
它开始检查文件名前的反斜杠,然后是非常基本的匹配


.

您确定您的正则表达式写得正确吗?您指定的格式是:
**c:\My\Path\To\File\fileName\u YYYY-MM-DD\u 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-9]。ext$”

您似乎缺少一个下划线


否则,乍一看表达式似乎是正确的。

既然可以使用
DateTime
s内置解析器,为什么还要使用regex呢:

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

创建一个正则表达式来验证
日期
,这是一件非常重要的事情,想象一下闰年。为什么不验证扩展名、前缀和后缀? 验证后缀时,可以非常方便地使用
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);

这里有很多答案。。。但它们似乎都不完整

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);

这应该涵盖一切。

对于那些不喜欢在这种情况下使用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();
Func CheckFileFormat=(文件名、文件掩码)=>
{
日期时间解析表;
return DateTime.TryParseExact(文件名、文件掩码、null、System.Globalization.DateTimeStyles.None、out-parsedFileDate);
};
字符串FileNameFormat=“'My_File_Name.'yyyy-MM-dd_HH-MM-ss'.csv';
string FileName=“My_File_Name_2017-10-11_15-46-16.csv”;
if(检查文件格式(文件名、文件名格式))
{
WriteLine($“文件匹配”);
}
其他的
{
控制台。WriteLine(“不匹配!”);
}
Console.ReadLine();


首先,一开始没有
^
。我将实际文件名从路径中分离出来,然后进行模式检查。“我仍然看到一些噪音”-具体是什么?你能举一些例子吗?啊。他也没有逃避他的点。文件名后没有下划线,文件名的情况也不一样。我建议你将你的正则表达式转储到许多可用的在线正则表达式验证器中,并摆弄它,直到它工作为止。这确实不是一个足够深入的问题,不足以在这里提出一个问题。尽管在日期/时间格式检查方面不如原来的准确。@nyrguds:True,但文件名确实来自某个地方。并非所有操作都应该使用正则表达式(即假设文件名中有正确的日期可能是合适的)。您还忘记了时间戳的“秒”部分,并且您的正则表达式将匹配以“文件名”部分之前的文本开头的文件。
filename_2016-99-56_47-93.ext
是有效文件吗?我怀疑:没有第99个月、
56个日等。实际上,用正则表达式验证日期是一项挑战task@DmitryBychenko当前位置请参阅我的第一条评论。文件名不是突然出现的,我知道使用这个表达式会有很多误报-但是使用regex做所有事情可能不是最好的选择。不。没有跳过扩展名前的点,也没有检查文件名的开始是否是文件名的开始。不过这并不难。这是一个C#问题,而不仅仅是正则表达式问题。只需事先分离文件名并仅检查该文件名,并确保正则表达式被
^$
@nyrguds-Hmm包围。。。在正则表达式的开头添加一个“\”,或为此进行编码。。。我想我会同意我的建议;)不过,它假定给定的文件名始终包含路径。可能不是这样。@Nyerguds True,但给定的需求说明存在路径。如果不是,则在开始时进行单词边界检查
\b
也会这样做。公平地说,这种格式的文件更可能是在这些日期创建的文件,而不是读取日期的文件。问题在于匹配模式,而不是从文件名中提取日期。@nyrguds:我认为问题在于验证(“检查文件格式是否符合预期”)正则表达式是否是建议的方法(IMHO,这不是最佳选择)。这就是为什么在我的回答中,我在没有正则表达式的情况下进行了验证。不过,您没有考虑windows文件系统的大小写不敏感。我建议
StringComparison.InvariantCultureIgnoreCase
@Nyerguds:谢谢!我已经用
StringComparison.invariantCultureInogoreCase
编辑了答案,但您只为扩展名做了编辑;)我喜欢这个,因为它避免了处理日期解析;但我会放弃对公共部分的正则表达式方法的拆分:
var match=regex.match(Path.GetFileName(input)?“”,@“^(?.*?)(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2})(?.*?);稍后您可以执行
match.Groups[“datetime”].Value
Heh。非常完整,是的。我个人只想在第一个
\uuu
的索引上使用子字符串,而不是使用Split,因为它肯定会更有效,尤其是因为您在后面的两个部分进行了合并。不过,它需要更多的代码。@nyrguds Dmitry Bychenko和我做的一样,除了你建议的子字符串,因为这是C#我将继续并假设名称不区分大小写(事实上,使用你的方法,那里的路径将不匹配),所以让这些部分[0]和扩展检查实际为