2015-10-20 51 views
-1

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

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

有人能帮助我吗?(这个表达式验证即使是闰年)

+0

这看起来像它也处理除了几年的日子,这是正确的吗?还是你在处理一个只包含一年的领域? – danjuggler

+0

对不起,这是一个“只写”的正则表达式。 – dasblinkenlight

+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))))$"); 

但我不知道它是你真正想要的。正则表达式已经被修补,我继续这样。但这不仅仅是维修噩梦,它表现得很奇怪。它接受空虚的一天,但只有在月份是一月,三月,可能......或空着。较少的代码行并不总是更好。我会建议彻底改写它。类似于这样的东西:

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