日期模式的正则表达式

本文关键字:正则表达式 模式 日期 | 更新日期: 2023-09-27 18:06:25

尝试用c#编写一个接受以下任何/所有条件的正则表达式:

  1. 02/01/1968
  2. 2/01/1968
  3. 2/1/1968

(这个问题与其他类似的问题有些不同,因为这是一个单词,采用mm/dd/yyyy格式。只需要模式,而不需要验证其可能性。例如,99/99/9999是ok的)

我什么也得不到。这是我目前得到的(只识别02/01/1968):

Regex regex = new Regex(@"^'d{2}/'d{2}/'d{4}$",RegexOptions.IgnorePatternWhitespace);
Match x = regex.Match(birthdate);
if (x.Success == false) return;

谢谢你的帮助。

日期模式的正则表达式

如注释中所述,使用日期时间解析器。要获得正确的正则表达式(只返回有效的日期时间)可能非常复杂且难以维护。

var formats = new[] { "d/M/yyyy", "dd/M/yyyy", "d/MM/yyyy", "dd/MM/yyyy" };
DateTime dt;
if (DateTime.TryParseExact(input, formats, null, DateTimeStyles.None, out dt))
{
    //parsed correctly
}

BTW:你的问题不清楚你是想要dd/mm还是mm/dd,我选择了第一个

如果必须使用regex来验证格式,则在范围量词中定义{min,max}:

^'d{1,2}/'d{1,2}/'d{4}$

下面是一个检查每个月正确天数的正则表达式,包括闰年期间的二月:

var reg = new Regex(@"'b(((0?[469]|11)/(0?[1-9]|[12]'d|30)|(0?[13578]|1[02])/(0?[1-9]|[12]'d|3[01])|0?2/(0?[1-9]|1'd|2[0-8]))/([1-9]'d{3}|'d{2})|0?2/29/([1-9]'d)?([02468][048]|[13579][26]))'b", RegexOptions.ECMAScript | RegexOptions.ExplicitCapture);

这样分解正则表达式应该很容易理解:

  • 30天的月份:0?[469]|11

  • 日数上限为30:0?[1-9]|[12]'d|30

  • 31天的月份:0?[13578]|1[02]

  • 最大值为31天:0?[1-9]|[12]'d|3[01]

  • Days max at at 28: 0?[1-9]|1'd|2[0-8]

  • 从1000+开始的任意年份(包括2位数年份):[1-9]'d{3}|'d{2}

  • Feb 29: 0?2/29

  • 闰年的后两位数字(能被4整除):[02468][048]|[13579][26]

  • RegexOptions.ECMAScript很重要,以确保'd只匹配英语中的0-9位数字。

  • RegexOptions.ExplicitCapture消除了(?:)的非捕获组

可以:

public static class Date_Regex
{
    static string DateRegex = @"'d?['/|'-|'s]?'d?['/|'-|'s]'d('s?)['/|'-|'s]?'d?('s?)['/|'-|'s]'d{4}['s]?$"; 
    public static string RegexMatches(string content)
    {
        StringBuilder sb = new StringBuilder();
        foreach (Match match in Regex.Matches(content, DateRegex, RegexOptions.Multiline)) 
        {
            sb.Append(match.Value + "; ");
        }
        return sb.ToString();
    }
}