viernes, 2 de mayo de 2014

Receta No. 2-5 en C#: Validar la Entrada de Datos con Expresiones Regulares

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Recursos
4. Práctica: Código Fuente C#
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

Una de las tareas más comunes en una sistema informático operado por un usuario es la entrada de datos a través de formularios, o archivos. Este proceso debe llamar la atención bastante de los programadores debido a que no cualquier dato puede ser almacenado, tratado, presentado, o visualizado sin antes pasar por un filtro de validación de su correcto formato, estructura y contenido. Nos vamos a detener en esta receta en aprender cómo realizar estas validaciones usando un recurso intuitivo y fácil de dominar (con algunas buenas horas de trabajo y dedicación, por supuesto) conocido como Expresiones Regulares.

1. Problema

En la actualidad el sistema informático de extractos y factura electrónica opera recibiendo un archivo de texto (archivo separado por punto y comas (;)) convirtiendo esta fuente en un reporte en formato Portable Document Format (PDF) que puede ser consultado por los clientes de la compañía SomosMás Ltda. Un auditor de sistemas informáticos ha detectado que los datos provenientes del archivo no son validados durante el proceso de Carga, transformación y almacenamiento (ETL: Extract Transform Load [2]) por esta razón nos ha llegado la siguiente solicitud de cambio en el proceso anterior: validar cada campo integral del formato (correo electrónico, dirección, número de teléfono, número de cuenta, y demás).

2. Solución

El arquitecto de esta solución ha recibido tal petición de cambio (actualización), y éste ha planteado el uso de expresiones regulares [3] para las validaciones de los datos que ingresan al sistema. Según él, la entrada de datos pasará por un filtro que valide su estructura y contenido; lo cual nos va a asegurar que la información almacenada esté libre de errores de fuente.

3. Discusión de la Solución

El consejo o sugerencia que nos dan en [1] consiste en que una buena práctica es asumir desde el principio que los datos no poseen la estructura y contenido válidos para nuestro sistema de información sino hasta que verificamos su precisión y exactitud. Los tipos de datos que comúnmente requieren de esta validación son:
  • Números de cuenta
  • Identificadores de usuario
  • Números de teléfono/móvil
  • Números de tarjetas de crédito
  • Direcciones postales/físicas
  • Direcciones IP
  • Direcciones de correo electrónico
Normalmente los datos bajo estas categorías siguen un patrón. Pongamos por caso el de las direcciones de Internet (IP):
  • DDD.DDD.DDD.DDD
Cada grupo DDD (octeto) es un número decimal entre 0 y 255. Estos grupos u octetos están separados por un signo de puntuación punto. Ejemplos válidos e inválidos:
  • 168.13.25.13
  • 192.168.1.254
  • 301.3.3.201
  • 0.0.0.0
  • 127.0.0.257
Estos casos son validados por un mecanismo de validación de estructura y contenido conocido como expresiones regulares. Éstas nos ayudan a comprobar que el contenido de un dato cumple con un patrón de datos ya definido (como los casos de las categorías de datos que mencionamos arriba); también nos permitirá comprobar su estructura. Ahora, dado que estamos a sujetos a comprobar la validez de un dato hasta que lo usemos (como normalmente ocurre); esta situación no es deseable debido a que en tiempo de ejecución de nuestra aplicación se generarán excepciones o errores indeseables e inesperados; esta es una de los motivos para crear y usar expresiones regulares en nuestros algoritmos de validación de datos.

Continuando, los controles visuales (componentes) modernos para crear interfaces gráficas de usuario, tales como: campos de texto, áreas de texto, &c., poseen validación para las categorías de datos más comunes, sin embargo, podemos crear nuestras propias reglas de validación de expresiones regulares. Quiero mencionar, a modo de paréntesis, un par de suites de controles visuales para WinForms:
  • DevExpress [4], y
  • Telerik [5]
Continuando con la teoría, las expresiones regulares están compuestas por dos partes bien definidas:
  • Literales: Representa el conjunto de caracteres que aparecen en el patrón de búsqueda.
  • Metacaracteres: Construcciones propias del lenguaje de expresiones regulares que representan clases, grupos, rangos de caracteres, condicionales e iteradores.
En la Figura 1 [1] se muestra el conjunto de metacaracteres usados en la construcción de expresiones regulares en los lenguajes soportados el Framework .NET.
Conjunto de metacaracteres de expresiones regulares en el Framework .NET
Figura 1. Conjunto de metacaracteres de expresiones regulares en el Framework .NET [1].
Por otro lado, hay una relación directamente proporcional en el proceso de construcción de expresiones regulares: la expresión regular puede resultar tan compleja como sea la complejidad de los datos que deseemos validar. En la Figura 2 [1] se muestra un listado de expresiones regulares simples, avanzando hasta las complejas:
Ejemplos de expresiones regulares
Figura 2. Ejemplos de expresiones regulares [2].

Evidentemente el Framework .NET cuenta con las construcciones y recursos para construir expresiones regular y validar datos de ingreso desde controles visuales, línea de comandos, y archivos de texto. Entre esos artefactos tenemos:
  • La clase System.Text.REgularExpressions.Regex [10]
  • El método IsMatch [11] (de la clase previa)
Ejemplos básicos del uso de estos artefactos:

Validación de una dirección de email:

string cadena = "johnortizo@outlook.com";
string regex = @"^((([\w]+\.[\w]+)+)|([\w]+))@(([\w]+\.)+)([A-Za-z]{1,3})$";

// Validación
if (Regex.IsMatch(cadena, regex))
{
Console.WriteLine("Email válido.");
}
else
{
Console.WriteLine("Email inválido.");
}

3.1 Recursos

En mi experiencia personal he tenido la oportunidad de usar este tipo recurso de validación de datos y me he apoyado en herramientas para hacer más productiva y eficaz la generación y uso de expresiones regulares. RegexBuddy es una de esas herramientas poderosas para crear y probar expresiones regulares antes de ponerla en nuestros algoritmos de validación. Aquí les dejo el enlace:

RegexBuddy [6].

Así mismo, en [1] nos sugieren otros recursos para aprender más acerca de expresiones regulares:
  • The Regulator [7]
  • RegExDesigner.NET [8], y
  • RegExLib.com [9]

4. Práctica: Código Fuente C#

Aquí vamos a escribir una aplicación de consola que tome una expresión regular y el dato a validar. Empecemos.


Compilación:


  1. csc /target.exe /out:ValidadorDatos.exe ValidadorDatos.cs

Ejecución:

(1):


  1. ValidadorDatos.exe "^[\w-]+@([\w-]+\.)+[\w-]+$" johnortizo@outlook.com

(2):


  1. ValidadorDatos.exe "^[\w-]+@([\w-]+\.)+[\w-]+$" johnortizo@outlook.com/

Resultado:
Ejemplo de ejecución validador de datos con expresiones regulares.
Figura 3. Ejemplo de ejecución validador de datos con expresiones regulares.
[Nota: En futuras entregas de artículos cubriré con más detalle la composición y uso de expresiones regulares.]

Conclusiones

La validación de la entrada (desde archivos de texto, o formularios de aplicaciones) juega un papel importantísimo en la creación de aplicaciones. No podemos confiarnos de lo que el usuario escribe o ingresa a nuestras aplicaciones, por eso debemos asumir que esos no son precisos ni correctos desde el principio: la validación a través de expresiones regulares nos salva el día.

Glosario

  • Expresión regular
  • Literal
  • Metacaracter
  • Regex
  • Regexp
  • Validar

Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Extract, transform, load, the free encyclopedia - https://en.wikipedia.org/wiki/Extract,_transform,_load
[3]: Regular expression, the free encyclopedia - https://en.wikipedia.org/wiki/Regular_expression
[4]: .NET UI Controls for Developers of Mobile, Desktop, Web & Reporting Applications | www.DevExpress.com - https://www.devexpress.com/
[5]: Telerik Mobile App Development Platform, .NET UI Controls, Web, Mobile, Desktop Development Tools - http://www.telerik.com/
[6]: RegexBuddy: Learn, Create, Understand, Test, Use and Save Regular Expression - http://www.regexbuddy.com/
[7]: Tools - http://osherove.com/tools/
[8]: Marquee de Sells: Chris's insight outlet - http://sellsbrothers.com/tools
[9]: Regular Expression Library - http://www.regxlib.com/?AspxAutoDetectCookieSupport=1
[10]: Regex Class (System.Text.RegularExpressions) - http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex%28v=vs.110%29.aspx
[11]: Regex.IsMatch Method (System.Text.RegularExpressions) - http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.ismatch%28v=vs.110%29.aspx


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.