En el día a día, siempre que es posible, buscamos establecer patrones que faciliten la comprensión y organización de la información, algo que hacemos naturalmente, después de todo, siempre estamos buscando formas de optimizar nuestra rutina.
Dentro del campo de la programación también existe esta preocupación por mejorar y optimizar la información, como se ve en los estándares de programación, estructuras de datos y algoritmos. Sin embargo, en la rutina de un programador, en algún momento te encontrarás con la necesidad de trabajar con cadenas de caracteres y buscar identificar patrones para extraer información o validar algún tipo de dato.
En este contexto, hoy tenemos las llamadas expresiones regulares, o el término abreviado en inglés, regex. Pero, ¿qué son? ¿Dónde viven? ¿De qué se alimentan? ¿Se pueden usar con .NET? En este artículo vamos a hablar un poco sobre ellas. ¡Vamos a la lectura!
Veamos algunas definiciones:
Según Alfredo Lotar, autor del libro "Cómo programar con ASP.NET y C#", una expresión regular define combinaciones de caracteres que podemos usar para representar partes de una cadena.
Y según Cláudio Ralha, autor del libro "Productividad con C#" de Casa do Código:
“Las expresiones regulares son herramientas para realizar tareas complejas con poco código, como localizar y eliminar varias ocurrencias de secuencias de caracteres dentro del texto, validar datos proporcionados por los usuarios que tienen un formato específico.”
Entonces, podemos concluir que una regex va a definir una forma de identificar patrones en cadenas de caracteres (strings) y que podemos usarla para validar datos.
La historia de las expresiones regulares está estrechamente ligada a la teoría de la computación, ya que forma parte de la teoría de autómatas y lenguajes formales. Las regex fueron desarrolladas en los estudios del matemático estadounidense Stephen Cole Kleene, quien inicialmente la llamó álgebra de conjuntos regulares.
Los trabajos de Kleene fueron la base para la creación de algoritmos de búsqueda utilizados en la informática. Hoy en día, aplicamos las regex en editores de texto, en funciones de búsqueda y reemplazo, y en lenguajes de programación como una forma de validar formatos de texto. Por ejemplo: cuando necesitamos validar el formato del campo de correo electrónico en un formulario, podemos usar: /^[a-z0-9.]+@[a-z0-9]+.[a-z]+.([a-z]+)?$/i;
.
Entonces, en resumen, las regex se pueden aplicar en situaciones de:
Cuando usamos regex, la búsqueda de caracteres, cadenas o patrones de texto se realiza de izquierda a derecha, de la misma manera en que leemos un texto (al menos según la lectura occidental). Esta búsqueda se puede realizar en una sola línea o en varias, además de poder diferenciar entre mayúsculas y minúsculas e incluso ignorar espacios en blanco.
Veamos un ejemplo de regex para validar un DNI:
/^[0-9]{3}.?[0-9]{3}.?[0-9]{3}-?[0-9]{2}/
En la definición de una regex podemos utilizar dos tipos de caracteres: los literales, que normalmente se usan en las cadenas, y los metacaracteres, que permiten a la regex procesar y manipular información. Hemos recopilado algunos metacaracteres en la siguiente tabla:
Meta | Descripción |
---|---|
* | Indica ninguna o varias ocurrencias de un carácter |
+ | Repite al menos una vez un carácter. Ejemplo: /a+/ |
^ | Indica que la búsqueda se realizará al inicio del bloque o regla |
$ | Señala que la búsqueda se realizará al final del bloque o regla |
? | Se utiliza para declarar un carácter como opcional |
| | Actúa como el operador lógico "o" |
‘ | Se utiliza para indicar un carácter |
() | Se utiliza para agrupar una secuencia. Ejemplo: /(abc)/ |
Además de estos, las regex también te permiten trabajar con agrupaciones, lo que puede ayudarnos a crear subexpresiones. Para definir grupos, podemos utilizar ()
. A continuación, enumeramos algunos ejemplos:
Grupos | Descripción |
---|---|
[aeiou] | Considera combinaciones de vocales |
{n} | Indica la cantidad de números devueltos |
[a-zA-Z_0-9] | Considera letras mayúsculas y minúsculas, y números |
{n,m} | Indica un rango |
Vale la pena destacar que crear una sentencia regex utilizando los símbolos y metacaracteres disponibles puede ser bastante laborioso. Dividir una expresión en partes puede ser de gran ayuda, al mejor estilo de "dividir y conquistar".
Por ejemplo, si queremos seleccionar todas las letras y números de un texto, podemos escribir una expresión que elija los números [0-9]
, luego escribir la que seleccione las letras [a-zA-Z]
. Finalmente, combinamos las partes de la expresión como [0-9][a-zA-Z]
.
Hasta aquí hemos visto que entre las ventajas de utilizar regex se encuentran la flexibilidad, el rendimiento y la facilidad de uso. Pero después de comprender la teoría, ¿cómo podemos utilizar regex con C#? Para esto, necesitamos utilizar una clase Regex
, ¡y eso es lo que conoceremos en el próximo tema!
En .NET, la clase principal para trabajar con regex tiene el mismo nombre, Regex, y se encuentra en el espacio de nombres System.Text.RegularExpressions
. Esta clase cuenta con una serie de métodos estáticos que nos permiten trabajar con expresiones regulares. Por ejemplo, si queremos validar que el valor proporcionado por un usuario esté compuesto únicamente por números, podemos hacer lo siguiente:
using System.Text.RegularExpressions;
Console.Write("Introduzca un valor: ");
var caracteres = Console.ReadLine();
bool ok = Regex.IsMatch(caracteres, "^[0-9]+$");
if (!ok)
{
Console.WriteLine("El valor indicado no es un número válido.");
}
else
{
Console.WriteLine("El valor informado es válido.");
}
Al ejecutar el código anterior e ingresar 14589AC
, obtenemos como salida lo que se muestra en la siguiente imagen:
También podemos crear un objeto del tipo Regex que reciba en su constructor un carácter o una expresión compuesta por metacaracteres. También es posible proporcionar un segundo parámetro para definir cómo realizar la búsqueda.
Imagina que necesitas validar el número de identificación de una persona, en este caso vamos a usar DNI. En lugar de crear todo un algoritmo, ¿por qué no usar una regex? Observa cómo podría implementarse:
Console.Write("Introduzca un DNI para la validación: ");
var dni = Console.ReadLine();
Regex regex = new Regex(@"([0-9]{4}[-]?[0-9]{2})|([0-9]{3}[\.]?[0-9]{3}[\.]?[0-9]{3}[-]?[0-9]{2})",RegexOptions.IgnoreCase);
var haCombinado = regex.Match(dni);
if (combinou.Success)
{
Console.WriteLine("DNI en formato válido.");
}
else
{
Console.WriteLine("DNI inválido.");
}
Al ejecutar el código anterior, el usuario ingresa un número de identificación personal (en este caso, DNI) que contiene solo números o que tiene una máscara con puntos. Se crea un objeto de la clase Regex
que recibe como parámetros una expresión para el DNI y una enumeración con el valor IgnoreCase
, que diferencia entre mayúsculas y minúsculas.
Al ejecutar el método .Match()
del objeto, validamos el DNI con la expresión regular definida en la creación del objeto. Para esto, es importante manejar el resultado creando un objeto del tipo Match.
Si queremos validar, por ejemplo, 000.869.630-66
, al ejecutarlo obtendremos la siguiente salida en la terminal:
Pero, ¿y si el DNI a validar no tiene la máscara de DNI? Por ejemplo, 99156503024
. ¿Qué sucede?
A continuación, presentamos algunas opciones de la enumeración RegexOptions
que podemos usar para crear nuestros objetos de expresiones regulares:
Valor | Descripción |
---|---|
IgnoreCase | Para ignorar mayúsculas o minúsculas |
CultureInvariant | No considerar idiomas |
Multiline | Realizar la búsqueda en múltiples líneas |
SingleLine | Realizar la búsqueda en una única línea |
RightToLeft | Realizar la búsqueda de derecha a izquierda |
IgnorePatternWhitespace | Ignorar patrones con espacios en blanco |
Con .IsMatch()
podemos validar si un valor dado coincide con la expresión regular definida. El método devuelve un valor booleano y recibe una cadena como parámetro. Usando el mismo ejemplo del DNI:
Console.Write("Introduzca un dni para validación: ");
var dni = Console.ReadLine();
Regex regex = new Regex(@"([0-9]{4}[-]?[0-9]{2})|([0-9]{3}[\.]?[0-9]{3}[\.]?[0-9]{3}[-]?[0-9]{2})", RegexOptions.IgnorePatternWhitespace);
if (regex.IsMatch(dni))
{
Console.WriteLine("DNI válido.");
}
else
{
Console.WriteLine("DNI inválido.");
}
Este método puede ser usado para buscar una cadena o expresión regex definida en la clase. Por ejemplo:
var busqueda = "Sumergirse en tecnología con Alura.";
Regex regex = new Regex("Alura",RegexOptions.IgnoreCase);
Match match = regex.Match(busca);
if (match.Success)
{
Console.WriteLine("string encontrada en el texto.");
}
else
{
Console.WriteLine("string no encontrada.");
}
A través de estos ejemplos, ¡podemos ver el poder que tenemos al utilizar expresiones regulares! Y en .NET, ¡usar la clase Regex
lo hace aún más fácil!
En este artículo, nuestro objetivo fue presentar qué son las expresiones regulares, desde su definición hasta su aplicabilidad en la programación. Entendemos que aplicar expresiones regulares para crear expresiones que validen el formato de caracteres, lo que permite buscar contenido específico, puede ser una herramienta valiosa para los desarrolladores, independientemente del lenguaje.
Los diferentes lenguajes tienen sus propias bibliotecas para trabajar con este recurso, ¡y en .NET no es diferente! Por eso conocimos la clase Regex
, que encapsula funcionalidades que permiten trabajar con expresiones regulares en el código de C#.
También observamos que, a pesar de la facilidad que ofrece la plataforma a la hora de utilizar expresiones regulares, escribirlas puede ser un desafío, ya que debemos resumir gran parte de la información en una sola expresión.
Para obtener más información sobre expresiones regulares, también puedes ver:
Soy programador e instructor de programación usando C# y .NET. Licenciado en Sistemas de Información. Ya he programado usando Java, PHP, C#, PostgreSQL y MySQL, además de haber trabajado con soporte también. Siempre buscando aprender más sobre tecnologías, sus aficiones son los cómics y las series.
Este artículo fue traducido para Alura Latam por Brenda Souza
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana
Paga en moneda local en los siguientes países
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana
Paga en moneda local en los siguientes países
Puedes realizar el pago de tus planes en moneda local en los siguientes países:
País | |||||||
---|---|---|---|---|---|---|---|
Plan Semestral |
487.37
BOB |
69289.36
CLP |
307472.10
COP |
65.90
USD |
264.35
PEN |
1435.53
MXN |
2978.57
UYU |
Plan Anual |
738.82
BOB |
105038.04
CLP |
466107.17
COP |
99.90
USD |
400.74
PEN |
2176.17
MXN |
4515.32
UYU |
Acceso a todos
los cursos
Estudia las 24 horas,
dónde y cuándo quieras
Nuevos cursos
cada semana