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

时间:2012-01-05 08:58:21

标签: c# regex

我想验证具有指定格式(YYYYMMDDHHmmRate)的文件名。例如,如果我的文件名是201109301030Rate.XML,我必须用指定的format.can验证它。任何人都帮我如何在C#中执行此操作

3 个答案:

答案 0 :(得分:2)

我会使用正则表达式来检查格式是否已关闭然后尝试解析到日期以检查它是否有效。

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

答案 1 :(得分:1)

如果您愿意接受一些无效日期,请参阅以下建议:

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日和其他非法律日期,但解析日期通常使用除正则表达式之外的其他方式更好。

答案 2 :(得分:1)

确认名称的可变部分是全部数字的正则表达式很容易:

^\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.
}