Saltar la navegación

5.- Expresiones regulares y objetos RegExp.

Caso práctico

Imagen de Juan.

Antonio ha comenzado a trabajar en un pequeño formulario del proyecto, y se da cuenta de que en uno de los campos tiene que solicitar al cliente que introduzca los datos en un formato determinado: los datos irán en grupos de caracteres separados por guiones y algunos datos tendrán que llevar paréntesis.

Antonio se pone en contacto con Juan, y le pregunta cómo puede hacer para validar que los datos sigan un formato o estructura en un campo de texto. Juan le indica que hay dos formas principales: una lenta y una rápida.

La forma lenta, consiste en trabajar con esa cadena de texto, y con los métodos del objeto String comprobar que se cumple el formato solicitado. Éste método implicará bastante lógica de programación por lo que dependiendo de la complejidad del formato a chequear habrá que evaluar varias condiciones.

La forma rápida, y recomendada por Juan, es el uso de expresiones regulares. De esta forma se podría realizar la validación solicitada, por muy complicada que sea, en dos o tres líneas prácticamente, pero eso sí, tendrá que aprender como crear una expresión regular y los caracteres utilizados en expresiones regulares. Pero el esfuerzo merecerá la pena de sobra, ya que el tiempo que le llevará a Antonio validar un campo empleando el método más lento, será el tiempo que necesitará para aprender expresiones regulares.

Las expresiones regulares son patrones de búsqueda, que se pueden utilizar para encontrar texto que coincida con el patrón especificado.

Ejemplo de búsqueda de una cadena de texto sin usar expresiones regulares:

let texto = "La linea de alta velocidad llegará pronto a toda España,";
let subcadena = "velocidad";
let indice = texto.indexOf(subcadena);     // devuelve 17, índice de donde se encuentra la subcadena
if (indice != -1)       
     // correcto, se ha encontrado la subcadena
     ....

Este código funciona porque estamos buscando una subcadena de texto exacta. ¿Pero qué pasaría si hiciéramos una búsqueda más general? Por ejemplo si quisiéramos buscar la cadena "car" en textos como "cartón", "bicarbonato", "practicar", ...?

Cuando estamos buscando cadenas que cumplen un patrón en lugar de una cadena exacta, necesitaremos usar expresiones regulares. Podrías intentar hacerlo con funciones de String, pero al final, es mucho más sencillo hacerlo con expresiones regulares, aunque la sintaxis de las mismas es un poco extraña y no necesariamente muy amigable.

En JavaScript las expresiones regulares se gestionan a través del objeto RegExp.

Para crear un literal del tipo RegExp, tendrás que usar la siguiente sintaxis:

let  expresion = /expresión regular/;

La expresión regular está contenida entre la barras /, y fíjate que no lleva comillas. Las comillas sólo se pondrán en la expresión regular, cuando formen parte del patrón en si mismo.

Las expresiones regulares están hechas de caracteres, solos o en combinación con caracteres especiales, que se proporcionarán para búsquedas más complejas. Por ejemplo, lo siguiente es una expresión regular que realiza una búsqueda que contenga las palabras Aloe Vera, en ese orden y separadas por uno o más espacios en medio:

let expresion = /Aloe\s+Vera/;

Los caracteres especiales en este ejemplo son, la barra invertida (\), que tiene dos efectos: o bien se utiliza con un carácter regular, para indicar que se trata de un carácter especial, o se usa con un carácter especial, tales como el signo más (+), para indicar que el carácter debe ser tratado literalmente. En este caso, la barra invertida se utiliza con "s", que transforma la letra s en un carácter especial indicando un espacio en blanco, un tabulador, un salto de línea, etc. El símbolo + indica que el carácter anterior puede aparecer una o más veces.

Cuando hablamos de expresiones regulares un literal, hace referencia a una cadena o estructura, que contiene caracteres especiales y símbolos que conforman el patrón de la expresión regular.