繁体   English   中英

日期模式的正则表达式?

[英]Regex for date pattern?

尝试在 C# 中编写一个接受以下任何/所有内容的正则表达式:

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

(这个问题与其他类似问题有些不同,因为这是一个单词,格式为 mm/dd/yyyy。仅需要模式,无需验证其可能性。即 99/99/9999 可以)

我很快就无处可去。 据我所知(仅识别 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
}

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

如果您必须使用正则表达式来验证格式,请在范围量词中定义{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]

  • 天数在 28: 0?[1-9]|1\\d|2[0-8]

  • 1000 年以上的任何年份(包括 2 位数年份): [1-9]\\d{3}|\\d{2}

  • 2 月 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();
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM