Expresión regular para asp: RegularExpressionValidator con formato MMddyy (problema del año bisiesto)

Necesitamos ayuda para la expresión regular que funcione con asp.net asp: RegularExpressionValidator para validar la fecha en formato MMddyy. El problema al que nos enfrentamos es el año bisiesto. El problema es que es posible verificar a través de la expresión regular que solo acepta fechas válidas del año bisiesto, ya que el 29/02/2008 es una fecha válida, pero el 29/02/2010 no es una fecha válida.

¿Alguna expresión regular que funcione con “asp: RegularExpressionValidator”?

OK, usted pidió una expresión regular. Aquí está. Creo que es obvio de inmediato por qué no es una buena idea validar una fecha con una expresión regular:

Primero, la versión detallada y comentada para al menos hacer posible la comprensión de esta bestia:

^ # start of string (?: # either match... (?: (?: # 31st day of all allowed months (?:(?:0?[13578]|1[02])/31) | # or (?:(?:0?[13-9]|1[0-2])/(?:29|30)) ) # 29th/30th day of any month except February / # plus any year since 1600 (?:1[6-9]|[2-9]\d) \d{2} ) | # or (?: # match Feb 29th 0?2/29/ (?: # in all leap years since 1600 (?: (?: # century 1[6-9]|[2-9]\d ) (?: # two-digit years divisible by four, not ending in 00 0[48] | [2468][048] | [13579][26] ) | (?: # all the leap years ending in 00 (?:16|[2468][048]|[3579][26]) 00 ) ) ) ) | # or (?: # (for any month) (?:0?[1-9]) | (?:1[0-2]) ) / (?: # match the 1st-28th day 0?[1-9]|1\d|2[0-8] ) / (?: (?:1[6-9]|[2-9]\d)\d{2} ) )$ 

O bien, si no puede usar expresiones regulares prolijas en los validadores de ASP.NET:

 ^(?:^(?:(?:(?:(?:(?:0?[13578]|1[02])/31)|(?:(?:0?[13-9]|1[0-2])/(?:29|30)))/(?:1[6-9]|[2-9]\d)\d{2})|(?:0?2/29/(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))/(?:0?[1-9]|1\d|2[0-8])/(?:(?:1[6-9]|[2-9]\d)\d{2}))$)$ 

Estos permiten, pero no requieren, un cero inicial en meses / días de un solo dígito. Si no quiere eso, reemplace todas las instancias de 0? con 0 .

Si el lado del servidor no es una opción, deberá usar JavaScript. Pruebe el código publicado y explicado aquí . Determina que el 29/02/2010 no es válido y el 29/02/2008 es válido. Use un Validador personalizado para llamar a la función de JavaScript cuando sea necesario.

Ya que necesita la lógica para validar los años bisiestos, considere el uso de CustomValidator . Reuní esto relativamente rápido, pero espero que entiendas la idea.

 protected void dateFormatValidator_ServerValidate(object source, ServerValidateEventArgs args) { if (args.Value.Length == 6) { var month = args.Value.Substring(0, 2); var day = args.Value.Substring(2, 2); var year = args.Value.Substring(4, 2); DateTime dummyValue; args.IsValid = DateTime.TryParse(month + "/" + day + "/" + year, out dummyValue); } else { args.IsValid = false; } } 

Como bitwise dice que CustomerSense JS es la manera de hacer esto, no es una expresión horrible a la alucinante publicación de Tom. Tengo un validador de fecha bastante ordenado en mi máquina de trabajo, lo publicaré el lunes.

Si alguna vez tienes algún tipo de problema de validación fallida con tu aplicación, ¿te imaginas la pesadilla de intentar descifrar esa expresión regular?