lunes, 21 de diciembre de 2009

Expresiones regulares: Fecha

Las expresiones regulares o patrones no son más que un grupo de caracteres orientados a cumplir una determinada condición. Por ejemplo, si queremos validar un número de DNI podemos hacerlo mediante sentencias if anidadas, comprobando su longitud, si contiene números o letras, etc. y también podemos hacerlo comparándola con una expresión regular. No entraré mucho en detalle, porque hay bastantes sitios que lo explican y seguro que además lo hacen mucho mejor que yo.
Pongo a continuación alguno de los sitios que he consultado:
Expresiones regulares en la Wikipedia.
Tutorial rápido para crear expresiones regulares (está en inglés):
http://www.regular-expressions.info/
Buscador de expresiones regulares:
http://regexlib.com/
Bueno, la principal razón por la que he abierto este post es la de incluir la expresión regular que he (iba a decir creado) adaptado a mis gustos desde otras que he encontrado por ahi. Es para validar campos con la fecha, no solo en lo que es el formato en sí sino también que los valores sean los correctos. La he limitado a los años 2000-2099 por comodidad, y he incluido seis formatos diferentes: 21/12/2000 21/12/09 21-12-2009 21-12-09 21122009 211209 De esta forma, contemplo las formas más comunes de escribir la fecha. el objetivo es que al introducir la fecha en un textbox me permita validarla. Adicionalmente, se podría utilizar también las expresiones regulares para convertir la fecha a un formato concreto, para que al resultar válidas las transforme a un formato concreto.
He dividido la expresión en dos patrones, para que el que quiera usar uno solo pueda hacerlo.
//Formato de Fecha: 12/12/2009 12-12-2009 12122009
//Fecha Minima: 01/01/2000
//Fecha Maxima: 31/12/2099
string Patron1 = "(((0[1-9]|[12][0-9]|3[01])([/]|[-])?(0[13578]|10|12)([/]|[-])?(’’d{4}))" +
"|(([0][1-9]|[12][0-9]|30)([/]|[-])?(0[469]|11)([/]|[-])?(’’d{4}))" +
"|((0[1-9]|1[0-9]|2[0-8])([/]|[-])?(02)([/]|[-])?(’’d{4}))" +
"|((29)([/]|[-])?(02)([/]|[-])?((20)[02468][048]))" +
"|((29)([/]|[-])?(02)([/]|[-])?((20)[13579][26])))";

//Fecha 12/12/09 12/12/09 121209
//Fecha Minima: 01/01/00
//Fecha Maxima: 31/12/99
string Patron2 = "(((0[1-9]|[12][0-9]|3[01])([/]|[-])?(0[13578]|10|12)([/]|[-])?(’’d{2}))" +
"|(([0][1-9]|[12][0-9]|30)([/]|[-])?(0[469]|11)([/]|[-])?(’’d{2}))" +
"|((0[1-9]|1[0-9]|2[0-8])([/]|[-])?(02)([/]|[-])?(’’d{2}))" +
"|((29)([/]|[-])?(02)([/]|[-])?([02468][048]))" +
"|((29)([/]|[-])?(02)([/]|[-])?([13579][26])))";

string Patron = "^("+Patron1+"|"+Patron2+")$";

Regex ExpresionRegular = new Regex(Patron);

if(ExpresionRegular.IsMatch(this.textBox1.Text.ToString()))
{
}

Básicamente lo que hacemos es buscar primero si coincide con los meses que tienen 31 días, con las opciones de todo junto, con / o con –. Después vemos si coincide con alguno de los meses que tienen 30 días, después valida la fecha del 28 de febrero, y por último si el día es el 29 comprueba que el año sea bisiesto. En otro momento, si tengo ganas y tiempo podré el código que compruebe el textbox, como aquí y además le sobreescriba con un formato de fecha concreto, para poder convertirlo a DateTime, por ejemplo.
Para el que quiera usarlo, recordar que hay que hacer referencia al espacio de nombres Text.RegularExpressions.

No hay comentarios:

Publicar un comentario