如何使用c#正则表达式验证包含日期的文件名

本文关键字:日期 文件名 包含 验证 何使用 正则表达式 | 更新日期: 2023-09-27 18:19:25

我想用指定的格式(YYYYMMDDHHmmRate)验证文件名。例如,如果我的文件名是201109301030Rate.XML,我必须用指定的格式验证它。谁能告诉我怎么用c#写呢

如何使用c#正则表达式验证包含日期的文件名

我会使用一个正则表达式来检查格式是否接近,然后尝试解析到日期来检查它是否有效。

var fileRegex = new Regex(@"^(?<Date>'d{12})Rate$");
var match = fileRegex.Match(Path.GetFileNameWithoutExtension(fileName));
DateTime fileNameDate;
bool success = match.Success && 
                   DateTime.TryParseExact(
                      match.Groups["Date"].Value,
                      "yyyyMMddHHmm",
                      CultureInfo.CurrentCulture, 
                      DateTimeStyles.None, 
                      out fileNameDate);

如果你愿意接受一些无效的日期,这里有一个建议:

foundMatch = Regex.IsMatch(subjectString, 
    @"^                           # Start of string
    (?:19|20)[0-9]{2}             # Year
    (?:0[1-9]|1[012])             # Month
    (?:0[1-9]|[12][0-9]|3[01])    # Day
    (?:[01][0-9]|2[0-3])          # Hour
    [0-5][0-9]                    # Minute
    '.xml                         # .XML
    $                             # End of string", 
    RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

这将接受2月31日和其他非合法日期,但解析日期通常使用其他方法比使用regex更好。

确认名称的可变部分为全数字的正则表达式非常简单:

^'d{12}Rate'.XML$

然而,创建一个检查日期是否有效的正则表达式将是相当困难的(因为字段相互作用:例如。年份影响月份的长度)。所以更容易解析日期/时间并使用它来执行详细检查:

DateTime dummy;
if (Regex.IsMatch(input, @"^'d{12}Rate'.XML$") 
   && DateTime.TryParseExact(input.SubString(0, 12),
                             "yyyyMMddHHmm", appropriateCultureInfo,
                             DateTimeStyles.None,
                             out dummy)) {
  // It is OK.
}