Conjuntos y rangos en expresiones regulares de JavaScript
Los conjuntos y rangos en expresiones regulares de JavaScript permiten validar texto, analizar datos y limpiar cadenas de forma eficiente.
Las expresiones regulares (regex) en JavaScript son una herramienta poderosa para el procesamiento y la manipulación de texto. Un conjunto de caracteres (o clase de caracteres) permite indicar "haz coincidir cualquiera de estos caracteres" en una posición concreta de la cadena — un bloque fundamental al que se recurre constantemente al validar entradas, analizar texto o limpiar datos.
Esta guía cubre los conjuntos [...], los rangos como [a-z0-9], la negación [^...], cómo escapar caracteres especiales dentro de un conjunto y cómo los conjuntos se combinan con clases abreviadas como \w y \d. Todos los ejemplos son ejecutables, así que puedes comprobar el resultado tú mismo.
Introducción a los conjuntos en regex
Un conjunto en una expresión regular especifica un grupo de caracteres, cualquiera de los cuales puede coincidir en una posición dada de la cadena de búsqueda. Los conjuntos se escriben entre corchetes []. Es importante destacar que un conjunto coincide con exactamente un carácter — [abc] coincide con una sola a, b o c, no con la cadena "abc".
Conjuntos básicos
Por ejemplo, el conjunto [abc] coincidirá con cualquier carácter individual que sea a, b o c. Con la bandera global g, match() devuelve cada uno de esos caracteres que encuentra:
Conjuntos negados
Para crear un conjunto negado que coincida con cualquier carácter que no esté en la lista, coloca un acento circunflejo ^ inmediatamente después del corchete de apertura. Por ejemplo, [^abc] coincide con cualquier carácter individual excepto a, b o c. El ^ solo tiene este significado especial en la primera posición; en cualquier otra parte es un acento circunflejo literal.
Comprensión de los rangos
Dentro de un conjunto se puede escribir un rango con un guion — inicio-fin — en lugar de listar cada carácter. Un rango coincide con cualquier carácter cuyo punto de código esté entre los dos extremos, inclusive. Esto hace que los patrones sean más cortos y legibles.
Rangos numéricos
Por ejemplo, [0-9] representa cualquier dígito del 0 al 9. Añadir + hace que coincida con uno o más dígitos consecutivos, de modo que los dígitos contiguos se agrupan en una sola coincidencia:
Rangos alfabéticos
De manera similar, [a-z] coincide con cualquier letra minúscula y [A-Z] con cualquier letra mayúscula. Puedes colocar varios rangos en un mismo conjunto — [A-Za-z0-9] abarca letras y dígitos — para coincidir con múltiples tipos de caracteres a la vez:
Un uso habitual en el mundo real es una comprobación básica de identificadores, donde el primer carácter debe ser una letra y el resto puede ser letras, dígitos o guiones bajos:
Uso avanzado de conjuntos y rangos
Puedes incluir clases abreviadas directamente en un conjunto junto con caracteres literales y rangos. Las abreviaciones se comportan igual dentro de [...] que fuera:
\d— un dígito, equivalente a[0-9]\w— un carácter de "palabra":[A-Za-z0-9_]\s— espacio en blanco (espacio, tabulación, salto de línea, …)
Así, [\d.] significa "un dígito o un punto", y [\w-] significa "un carácter de palabra o un guion". Consulta Clases de caracteres para ver la lista completa y las formas negadas en mayúsculas (\D, \W, \S).
Ejemplo: Combinación de caracteres de palabra y símbolos especiales
Este es un caso práctico: conservar caracteres de palabra y un signo de puntuación específico, ignorando el resto.
Aquí, \w abarca todas las letras, dígitos y el guion bajo. Añadir ! al conjunto también hace coincidir el signo de exclamación, que \w no incluye. Esto es muy útil cuando quieres permitir algunos símbolos específicos sin abrir la coincidencia a toda la puntuación.
Soporte Unicode y multilingüe
Los rangos como [a-z] solo cubren letras ASCII — no incluyen caracteres acentuados ni caracteres no latinos. Para coincidir con letras de cualquier idioma, usa escapes de propiedades Unicode (ECMAScript 2018+) junto con la bandera u. Por ejemplo, \p{L} coincide con cualquier tipo de letra de cualquier escritura:
La bandera u es necesaria para que \p{...} funcione. Aprende más en La bandera unicode "u" y la clase \p{...} y el resumen de Patrones y banderas.
Exclusión de rangos en expresiones regulares
La negación también funciona con rangos. [^0-9] coincide con cualquier carácter que no sea un dígito, y puedes mezclar rangos y caracteres individuales después del acento circunflejo. Una tarea frecuente es eliminar o encontrar todo lo que no pertenece a un grupo permitido — aquí, cada carácter que no es una vocal (la bandera i hace que no distinga mayúsculas de minúsculas):
Ejemplo de exclusión de rangos
Esta expresión regular encontrará todos los caracteres que no son vocales, incluidos la puntuación y los espacios. Es una forma eficaz de filtrar caracteres no deseados de una cadena.
Escapado de caracteres especiales en conjuntos
Dentro de un conjunto, muchos menos caracteres son especiales que fuera de él. Solo hay que preocuparse por cuatro: el corchete de cierre ], la barra invertida \, el acento circunflejo ^ (especial solo al principio) y el guion - (especial solo entre dos caracteres). Escapa cualquiera de ellos con una barra invertida para usarlos de forma literal.
Un atajo útil: un guion se trata como literal si es el primer o último carácter del conjunto, por lo que [-+] y [a-z-] no necesitan escapado. Asimismo, los caracteres que son especiales fuera de un conjunto — como ., *, +, (, ) — pierden su significado dentro del conjunto y coinciden literalmente, de modo que [.+] simplemente coincide con un punto o un signo más.
Ejemplo de escapado de caracteres especiales
Aquí los corchetes están escapados para que se lean como caracteres literales en lugar de abrir y cerrar un conjunto. El siguiente ejemplo muestra la regla del guion como literal y la regla del punto que pierde su poder, juntas:
Conclusión
Dominar los conjuntos y rangos en las expresiones regulares de JavaScript no solo mejora tus capacidades de manipulación de cadenas, sino que también conduce a un código más limpio y eficiente. Son especialmente poderosos para analizar texto, validar entradas y procesar datos en el desarrollo web.