alphanumerictextwith_yyyymmddhhmmss.xml的正则表达式

alphanumerictextwith_yyyymmddhhmmss.xml的正则表达式

问题描述:

我需要使用以下模式检查文件名;
ABC_123_ABC_ABC_yyyymmddhhmmss.XMLalphanumerictextwith_yyyymmddhhmmss.xml的正则表达式

我写这个正则表达式

ABC_123_ABC_ABC_(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8])))))(?:0[0-9]|1[0-9]|2[0-3])(?:[0-5][0-9]){2}.XML 

它在正则表达式测试工作,但不是在C#代码。

Here is my regex online tester with full match

here is my Code

代码

private static bool IsCorrectFileName(string fILENAME) 
{ 
    string filenamePattern = "ABC_123_ABC_ABC_(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8])))))(?:0[0-9]|1[0-9]|2[0-3])(?:[0-5][0-9]){2}.XML"; 
    Regex filenameRegex = new Regex(filenamePattern); 
    return filenameRegex.IsMatch(filenamePattern); 
} 
+0

在此提供示例场景。 –

+0

如果将最后一条语句更改为'return filenameRegex.IsMatch(fILENAME);'? – Spotted

+0

替代方法:使用正则表达式解析文件名,但使用捕获组(小时,分钟等)并验证代码中的范围(0-24,0-59,每月的天数)。没办法,你可以确保它也适用于闰年。 –

根据我的经验,我会避免尽可能多地使用正则表达式。他们很快变得难以理解,很难调试。

这就是为什么我宁愿不培育他们的实现:

private static readonly string prefix = "ABC_123_ABC_ABC_"; 
private static readonly string dateFormat = "yyyyMMddHHmmss"; 
private static readonly string extension = ".xml"; 

private static bool IsCorrectFileName(string filename) 
{ 
    DateTime dummy; 
    return filename.StartsWith(prefix) && 
      DateTime.TryParseExact(filename.Substring(prefix.Length, dateFormat.Length), dateFormat, null, DateTimeStyles.None, out dummy) && 
      filename.EndsWith(extension); 
} 

使用DateTime.TryParseExact你得到的好处免费为所有日期odities像闰年,30/31月结束,等