如何使用c#正则表达式验证包含日期的文件名
本文关键字:日期 文件名 包含 验证 何使用 正则表达式 | 更新日期: 2023-09-27 18:19:25
我想用指定的格式(YYYYMMDDHHmmRate)验证文件名。例如,如果我的文件名是201109301030Rate.XML,我必须用指定的格式验证它。谁能告诉我怎么用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.
}