2012-06-07 54 views
5

No soy experto en escribir expresiones regulares, así que necesito su ayuda. Quiero validar la fecha en formato "dd-MMM-aaaa", es decir, 07-jun-2012. Estoy usando RegularExpressionValidator en asp.net.Necesita expresión regular para validar la fecha en formato dd-MMM-yyyy

¿Alguien me puede ayudar proporcionando la expresión?

Gracias por compartir su tiempo.

+1

Dónde está llegando los datos de - si la entrada de usuario sin duda mejor utilizar un campo de fecha para validar plenamente -como una expresión regular no capturará el 29 de febrero correcto, etc. – Mark

+0

¿Desea fechas sintácticamente válidas o desea fechas reales válidas? Por ejemplo, ¿debería la expresión regular rechazar el 30 de febrero de 2012 porque es una fecha imposible? – BunjiquoBianco

+0

Solo necesito fechas sintácticamente válidas, aunque sería mejor si Regex lo valida por completo. – IrfanRaza

Respuesta

18

Usar un DatePicker es probablemente el mejor enfoque. Sin embargo, ya que eso no es lo que usted pidió, aquí está una opción (aunque es mayúsculas y minúsculas):

^(([0-9])|([0-2][0-9])|([3][0-1]))\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\-\d{4}$ 

Además, aquí hay un lugar donde se puede probar fácilmente las expresiones regulares: http://www.regular-expressions.info/javascriptexample.html

+0

Gracias Mark, Its working. – IrfanRaza

+0

nice ver enlace para probar expresiones regulares –

4

Regex sin cero inicial en el día.

^\d{1,2}-[a-zA-Z]{3}-\d{4}$ 

actualización expresión regular con cero a la izquierda en día.

^\d{2}-[a-zA-Z]{3}-\d{4}$ 
+0

'\ d' significa cualquier dígito, por lo que el primero acepta ' 0 'y' 88 'como día. También '[a-zA-Z] {3}' coincide con "xYz". –

+0

Perfecto Gracias @Leonov Mikhail – Rauld

3

No es de expresiones regulares, pero puede utilizar la acumulación en DateTime.TryParseExact función para validar la cadena de fecha y hora

DateTime dateTime; 
string toValidate = "01-Feb-2000"; 

bool isStringValid = DateTime.TryParseExact(
    toValidate, 
    "dd-MMM-yyyy", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out dateTime); 
+0

+1 para evitar expresiones regulares y sus limitaciones. – Junuxx

0

Sin embargo, otra idea sería la de probar este (similar a la idea de user1441894):

var x = DateTime.Parse("30-Feb").GetDateTimeFormats(); 

Aprendí a usar esto ayer (para un propósito diferente). Así que trate de capturas accesorias esta declaración para hacer frente a la validez/invalidez de la fecha :)

-1
using System.Text.RegularExpressions 

private void fnValidateDateFormat(string strStartDate,string strEndDate) 
{ 
    Regex regexDt = new Regex("(^(((([1-9])|([0][1-9])|([1-2][0-9])|(30))\\-([A,a][P,p][R,r]|[J,j][U,u][N,n]|[S,s][E,e][P,p]|[N,n][O,o][V,v]))|((([1-9])|([0][1-9])|([1-2][0-9])|([3][0-1]))\\-([J,j][A,a][N,n]|[M,m][A,a][R,r]|[M,m][A,a][Y,y]|[J,j][U,u][L,l]|[A,a][U,u][G,g]|[O,o][C,c][T,t]|[D,d][E,e][C,c])))\\-[0-9]{4}$)|(^(([1-9])|([0][1-9])|([1][0-9])|([2][0-8]))\\-([F,f][E,e][B,b])\\-[0-9]{2}(([02468][1235679])|([13579][01345789]))$)|(^(([1-9])|([0][1-9])|([1][0-9])|([2][0-9]))\\-([F,f][E,e][B,b])\\-[0-9]{2}(([02468][048])|([13579][26]))$)"); 

    Match mtStartDt = Regex.Match(strStartDate,regexDt.ToString()); 
    Match mtEndDt = Regex.Match(strEndDate,regexDt.ToString()); 
    if (mtStartDt.Success && mtEndDt.Success) 
    { 
      //piece of code 
    } 
} 
0
"^(([1-9]|0[1-9]|1[0-9]|2[1-9]|3[0-1])[-]([JAN|FEB|MAR|APR|MAY|JUN|JULY|AUG|SEP|OCT|NOV|DEC])[-](d{4}))$" 
+0

¡Incluyendo un breve sobre el código/solución haría que esta respuesta sea completa! –

1

La solución aceptada permite '00' como el día, por lo que aquí hay una solución para que:

^(([1-9])|([0][1-9])|([1-2][0-9])|([3][0-1]))\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\-\d{4}$ 

Notas/Excepciones:

1. Tenga en cuenta los problemas de sensibilidad de mayúsculas y minúsculas. P.ej. 'DEC' no pasará mientras 'Dec' pase. Es posible que desee convertir la cadena de expresiones regulares y la cadena de prueba en minúsculas antes de realizar la prueba (si su aplicación lo permite).

2. Este no cogerá días que no existen, como Feb 30, 31 de junio etc.

Cuestiones relacionadas