[C#] Validación con expresiones regulares

10 Comentarios

Las expresiones regulares son modelos que describen las combinaciones de caracteres en el texto. Se podrían definir como una serie de carácteres que forman un patrón, que representan a otro grupo de carácteres mayor, de tal forma que podemos comparar el patrón con otros conjuntos de carácteres para ver las coincidencias. Las expresiones regulares pueden utilizarse en múltiples lenguajes de programación pero en esta entrada vamos a ver un ejemplo de validación de formularios mediante Javascript y haciendo uso de expresiones regulares.

Un buen tutorial para iniciarse en el manejo de expresiones regulares lo podemos encontrar en Desarrolloweb. Para realizar el ejemplo siguiente no hay porque conocer en profundidad su manejo. A continuación muestro una serie de tablas a modo de chuleta para que podamos utilizarlas con un simple corta y pega.

La tabla siguiente contiene los caracteres especiales de las expresiones regulares.

Carácter Texto buscado
^ Principio de entrada o línea.
$ Fin de entrada o línea.
* El carácter anterior 0 o más veces.
+ El carácter anterior 1 o más veces.
? El carácter anterior una vez como máximo (es decir, indica que el carácter anterior es opcional).
. Cualquier carácter individual, salvo el de salto de línea.
x|y x o y.
{n} Exactamente n apariciones del carácter anterior.
{n,m} Como mínimo n y como máximo m apariciones del carácter anterior.
[abc] Cualquiera de los caracteres entre corchetes. Especifique un rango de caracteres con un guión (por ejemplo, [a-f] es equivalente a [abcdef]).
[^abc] Cualquier carácter que no esté entre corchetes. Especifique un rango de caracteres con un guión (por ejemplo, [^a-f] es equivalente a [^abcdef]).
\b Límite de palabra (como un espacio o un retorno de carro).
\B Cualquiera que no sea un límite de palabra.
\d Cualquier carácter de dígito. Equivalente a [0-9].
\D Cualquier carácter que no sea de dígito. Equivalente a [^0-9].
\f Salto de página.
\n Salto de línea.
\r Retorno de carro.
\s Cualquier carácter individual de espacio en blanco (espacios, tabulaciones, saltos de página o saltos de línea).
\S Cualquier carácter individual que no sea un espacio en blanco.
\t Tabulación.
\w Cualquier carácter alfanumérico, incluido el de subrayado. Equivalente a [A-Za-z0-9_].
\W Cualquier carácter que no sea alfanumérico. Equivalente a [^A-Za-z0-9_].

La tabla siguiente contiene algunos de los patrones más utilizados a la hora de validar formularios. Si alguien conoce alguna expresión regular más -que pueda ser útil en la validación de formularios- la puede poner en los comentarios y yo la incorporaré a esta tabla.

Cualquier letra en minuscula [a-z]
Entero ^(?:\+|-)?\d+$
Correo electrónico /[\w-\.]{3,}@([\w-]{2,}\.)*([\w-]{2,}\.)[\w-]{2,4}/
URL ^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)( [a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$
Contraseña segura (?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$(Entre 8 y 10 caracteres, por lo menos un digito y un alfanumérico, y no puede contener caracteres espaciales)
Fecha ^\d{1,2}\/\d{1,2}\/\d{2,4}$(Por ejemplo 01/01/2007)
Hora ^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$(Por ejemplo 10:45:23)
Número tarjeta de crédito ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$
Número teléfono ^[0-9]{2,3}-? ?[0-9]{6,7}$
Código postal ^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$
Certificado Identificación Fiscal ^(X(-|\.)?0?\d{7}(-|\.)?[A-Z]|[A-Z](-|\.)?\d{7}(-|\.)? [0-9A-Z]|\d{8}(-|\.)?[A-Z])$
Valida sólo números del 1 al 12 (ideal para meses) ^([0-1]?[0-2]|[0-9])$
Valida de 0.1 a 9.9 ^([0-9].[1-9])$
Valida desde 10.01 hasta 99.99 con 2 decimales máximo ^[0-9][0-9](.[0-9][0-9])$
Valida desde 0.01 hasta 99.99 con sólo 2 decimales máximo ^[0-9]?[0-9](.[0-9][0-9])$

Aquí les dejo el código y mas abajo el proyecto:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace Cs_ValidacionDatos
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void txtcodigo_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_numero(txtcodigo))
            {
                errorProvider1.SetError(txtcodigo, String.Empty);
                txtcodigo.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txtcodigo, "Solo numeros");
                txtcodigo.BackColor = Color.MistyRose;
            }
        }

        private void txtemail_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_email(txtemail))
            {
                errorProvider1.SetError(txtemail, String.Empty);
                txtemail.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txtemail, "[email protected]");
                txtemail.BackColor = Color.MistyRose;
            }
        }

        private void txtnombre_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_cadena(txtnombre))
            {
                errorProvider1.SetError(txtnombre, String.Empty);
                txtnombre.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txtnombre, "Solo letras");
                txtnombre.BackColor = Color.MistyRose;
            }
        }

        private void txttelf_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_telefono(txttelf))
            {
                errorProvider1.SetError(txttelf, String.Empty);
                txttelf.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txttelf, "Formato: 999-9999");
                txttelf.BackColor = Color.MistyRose;
            }
        }

        private void txtweb_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_url(txtweb))
            {
                errorProvider1.SetError(txtweb, String.Empty);
                txtweb.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txtweb, "www.example.com");
                txtweb.BackColor = Color.MistyRose;
            }
        }

        private void txtsueldo_KeyUp(object sender, KeyEventArgs e)
        {
            if (es_decimal(txtsueldo))
            {
                errorProvider1.SetError(txtsueldo, String.Empty);
                txtsueldo.BackColor = Color.Honeydew;
            }
            else
            {
                errorProvider1.SetError(txtsueldo, "Formato: 00,00");
                txtsueldo.BackColor = Color.MistyRose;
            }
        }

        private static bool es_numero(Control mitextbox)
        {

            Regex regex = new Regex(@"^[0-9]+$");
            return regex.IsMatch(mitextbox.Text);

        }

        private static bool es_cadena(Control mitextbox)
        {

            Regex regex = new Regex(@"^[^ ][a-zA-Z ]+[^ ]$");
            return regex.IsMatch(mitextbox.Text);

        }

        private static bool es_telefono(Control mitextbox)
        {

            Regex regex = new Regex(@"^([0-9]{3})[-. ]?([0-9]{4})$");
            return regex.IsMatch(mitextbox.Text);

        }

        private static bool es_decimal(Control mitextbox)
        {

            Regex regex = new Regex(@"^[0-9]{1,9}([\.\,][0-9]{1,3})?$");
            return regex.IsMatch(mitextbox.Text);

        }

        private static bool es_url(Control mitextbox)
        {

            Regex regex = new Regex(@"^[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)$");
            return regex.IsMatch(mitextbox.Text);
        }

        private static bool es_email(Control mitextbox)
        {

            Regex regex = new Regex(@"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$");

            // Resultado:
            //       Valid: [email protected]
            //       Valid: [email protected]
            //       Valid: [email protected]
            //       Invalid: j.@server1.proseware.com
            //       Invalid: [email protected]
            //       Valid: [email protected]
            //       Valid: j_9@[129.126.118.1]
            //       Invalid: j..[email protected]
            //       Invalid: js*@proseware.com
            //       Invalid: js@proseware..com
            //       Invalid: [email protected]
            //       Valid: [email protected]

            return regex.IsMatch(mitextbox.Text);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            txtcodigo.Text = String.Empty;
            txtcodigo.BackColor = Color.White;
            errorProvider1.SetError(txtcodigo,String.Empty);

            txtnombre.Text = String.Empty;
            txtnombre.BackColor = Color.White;
            errorProvider1.SetError(txtnombre, String.Empty);

            txttelf.Text = String.Empty;
            txttelf.BackColor = Color.White;
            errorProvider1.SetError(txttelf, String.Empty);

            txtweb.Text = String.Empty;
            txtweb.BackColor = Color.White;
            errorProvider1.SetError(txtweb, String.Empty);

            txtemail.Text = String.Empty;
            txtemail.BackColor = Color.White;
            errorProvider1.SetError(txtemail, String.Empty);

            txtsueldo.Text = String.Empty;
            txtsueldo.BackColor = Color.White;
            errorProvider1.SetError(txtsueldo, String.Empty);

        }

        private void button2_Click(object sender, EventArgs e)
        {

            if (es_numero(txtcodigo) == true && es_cadena(txtnombre) == true && es_telefono(txttelf) == true &&
                es_url(txtweb) == true && es_email(txtemail) == true && es_decimal(txtsueldo) == true)
            {
                MessageBox.Show("OK");
            }
            else
            {
                MessageBox.Show("Complete todos los campos.");
            }

        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.Close();
        }

    }
}


Fuente: webintenta.com

Comentarios

  • http://fiver.com/users/crorkservice bookmarking submission

    9elCT6 A big thank you for your blog post.Really thank you! Fantastic.

  • http://linuxhp.wordpress.com/ Santiago Burgos

    Hola, gracias por todas las expresiones y el significado de cada símbolo ha sido de gran ayuda para revisar cosas en mi proyecto y en mi trabajo (aunque aca use VB.NET en vez de C#), en fin, aca te dejo algunas que talvez no sean la manera adecuada pero me funcionaron bastante bien:

    ([0-1]?[0-2]|[0-9]) -> Valida sólo números del 1 al 12 (ideal para meses)
    ([0-9].[1-9]) -> Valida de 0.1 a 9.9
    [0-9][0-9](.[0-9][0-9])? -> Valida desde 10.01 hasta 99.99 con 2 decimales máximo
    [0-9]?[0-9](.[0-9][0-9])? -> Valida desde 0.01 hasta 99.99 con sólo 2 decimales máximo

    Cualquier cosa me puedes contactar y a ver que mas tengo (que no es mucho pero me sirvieron bastante en su debido momento). Saludos

    • http://entrecodigos.net/ Jorge

      gracias por el aporte :D

  • Manuel Brioso

    Hola,

    Despues de tanto buscar en la red, por fin algo que si lleno mis expectativas, he probado la aplicacion y me ha funcionado todo muy bien.

    Estaba buscando como validar un campo de email y por fin algo que si funciona!!!!

  • Luis

    Se puede hacer para una cantidad d e caracteres, osea por ejemplo, se quiere validar aparte que sean solo numeros, que tenga una cantidad determinada con por ejemplo 8 caracteres, o minimo 6 caracteres

    • http://entrecodigos.net/ Jorge

      puedes validarlo directamente en las propiedades del textbox:
      textbox1.MaxLength=8;

  • ffrfrf

    ^([0-1]?[0-2]|[0-9])$ trato de utilisar esto de esta forma y no me funciona cuando valido el patron a medida que el usuario introduce las tecklas porfavor cualquier consejo lo apresiaria e aqui el script de java

    function validar2(e) { // 1
    tecla = (document.all) ? e.keyCode : e.which; // 2
    if (tecla==8) return true; // 3
    patron =/^([0-1]?[0-2]|[0-9])$/ ; // 4
    te = String.fromCharCode(tecla); // 5
    return patron.test(te); // 6
    }

  • diego

    Oye tengo una duda, quiero checar esta expresion a*a(b*)b, el problema es que solo quiero que admita cadenas como aab, aabbb, y no cadenas como fgaab, sasaabbbadd, uso Regex.IsMatch y esta funcion checa que dentro de la cadena se cumpla almenos una vez, pero yo solo quiero que se cumplan las primeras cadenas y lo segundas no. alguna idea?

  • Pingback: VS C# – Proyecto 1: Validaciones | Falkhan Unilibre

  • Programer

    Muy interesante tu post, muchas gracias por compartir la info, seria bueno si publicas alguna entrada donde expliques como crear nuestras propias validaciones (la sintaxis), estoy empezando a programar en Asp net y necesito validar alguno cuadros de texto, lo que no se es como validar que una cantidad ingresada sea mayor a 0 (cero) y que admita solo numero, he buscado pero no encuentro como validar esto, encontre que puedo ocupa d pero esto solo admite un digito, te agradeceria mucho si me ayudas. Saludos y gracias de antemano.