正则表达式为alphanumerictextwith_yyyymmddhhmmss.xml

问题描述 投票:-3回答:1

我需要用以下模式检查文件名; ABC_123_ABC_ABC_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

它在regex测试器中工作,但在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);
}
c# regex
1个回答
1
投票

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

这就是为什么我宁愿在没有它们的情况下促进实施:

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,您可以免费获得所有日期的好处,如闰年,30/31月结束等。

© www.soinside.com 2019 - 2024. All rights reserved.