正则表达式c# - 在哪里插入空格

时间:2015-10-20 16:51:06

标签: c# regex

我想允许用户输入空白年份,但我不知道在下面的表达式中放置\ s \ s \ s \ s的位置。 以下是我需要做的示例:如果用户插入03-07 -_____,则必须每年7月3日执行该程序(如果用户插入空白日期,月份或年份,则以相同方式执行这三个中的两个)

System.Text.RegularExpressions.Regex rdate =
    new System.Text.RegularExpressions.Regex(@"^((((0?[1-9]|[12]\d|3[01]|\s\s|\s\d)[\-](0?[13578]|1[02]|\s\s)[\-]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\-](0?[13456789]|1[012])[\-]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\-]0?2[\-]((1[6-9]|[2-9]\d)?\d{2}))|(29[\-]0?2[\-]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$");

有人可以帮助我吗?(这个表达甚至可以验证闰年)

1 个答案:

答案 0 :(得分:0)

以下是您要求的内容

System.Text.RegularExpressions.Regex rdate =
    new System.Text.RegularExpressions.Regex(@"^((((0?[1-9]|[12]\d|3[01]|\s\s|\s\d)[\-](0?[13578]|1[02]|\s\s)[\-]((1[6-9]|[2-9]\d)?\d{2}|\s\s\s\s))|((0?[1-9]|[12]\d|30)[\-](0?[13456789]|1[012])[\-]((1[6-9]|[2-9]\d)?\d{2}|\s\s\s\s))|((0?[1-9]|1\d|2[0-8])[\-]0?2[\-]((1[6-9]|[2-9]\d)?\d{2}|\s\s\s\s))|(29[\-]0?2[\-]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00|\s\s\s\s)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$");

但我不确定这是你真正想要的。正则表达式已经修补,我继续前进。但不仅是维护噩梦,它表现得很奇怪。它接受空日,但只有月份是1月,3月,可能......或者空。减少代码行并不总是更好。我建议完全改写它。与此类似的东西:

    protected DateTime? getDateTimeFromParts(string day, string month, string year)
    {
        DateTime now = DateTime.Now;

        int iyear;
        if (string.IsNullOrWhiteSpace(year))
        {
            iyear = now.Year;
        }
        else
        {
            iyear = int.Parse(year);
            if (iyear >= 0 && iyear < 100) { iyear += 2000; }
        }

        int imonth;
        if (string.IsNullOrWhiteSpace(month))
        {
            imonth = now.Month;
        }
        else
        {
            imonth = int.Parse(month);
        }

        int iday;
        if (string.IsNullOrWhiteSpace(day))
        {
            iday = now.Day;
        }
        else
        {
            iday = int.Parse(day);
        }

        if (iyear <= DateTime.MaxValue.Year && iyear >= DateTime.MinValue.Year)
        {
            if (imonth >= 1 && imonth <= 12)
            {
                if (DateTime.DaysInMonth(iyear, imonth) >= iday && iday >= 1)
                    return new DateTime(iyear, imonth, iday);
            }
        }

        return null;
    }

    protected DateTime? getDateTime(string dateStr)
    {
        Regex r = new Regex(@"^(\d\d)(\d\d)((\d\d)?\d\d)$");
        Match m = r.Match(dateStr);

        if (m.Success)
        {
            return getDateTimeFromParts(m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value);
        }

        r = new Regex(@"^(\d?\d|\s\d|\s\s)[-](\d?\d|\s\s)[-]((\d\d)?\d\d|\s\s\s\s)$");
        m = r.Match(dateStr);

        if (m.Success)
        {
            return getDateTimeFromParts(m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value);
        }

        return null;
    }