Saltar al contenido
LeedyBox
Apoyar

Conceptos básicos de expresiones regulares

Una expresión regular (regex) es un patrón que describe texto. Esta guía repasa los elementos que más vas a usar y los errores que provocan coincidencias lentas o inesperadas.

Literales y clases de caracteres

La mayoría de los caracteres coinciden consigo mismos: el patrón cat encuentra el texto «cat». Algunos caracteres tienen un significado especial, como . * + ? ( ) [ ] { } ^ $ | \. Para buscar uno de ellos de forma literal, escápalo con una barra invertida, por ejemplo \. para un punto.

Una clase de caracteres coincide con un carácter de un conjunto. [abc] coincide con a, b o c; [a-z] coincide con una letra ASCII minúscula; [^0-9] coincide con cualquier cosa que no sea un dígito. Las abreviaturas habituales son \d (dígito), \w (letra, dígito o guion bajo), \s (espacio en blanco) y sus opuestos \D, \W y \S. El punto . coincide con cualquier carácter excepto un salto de línea.

En JavaScript, \w y \d solo abarcan caracteres ASCII. Para buscar letras de cualquier idioma, usa una propiedad Unicode como \p{L} con el flag u.

Cuantificadores y anclas

Los cuantificadores indican cuántas veces puede repetirse el elemento anterior:

SintaxisSignificadoEjemplo
*0 o másab* coincide con a, ab, abbb
+1 o más\d+ coincide con 7 o 2026
?0 o 1colou?r coincide con color y colour
{n,m}Entre n y m\d{2,4} coincide con 2 a 4 dígitos

Las anclas coinciden con una posición en lugar de con un carácter. ^ es el inicio y $ el final de la entrada (o de cada línea con el flag m). \b es un límite de palabra, así que \bcat\b encuentra «cat» pero no «concatenate». Al validar un valor completo, ancla ambos extremos: ^\d{5}$ acepta exactamente cinco dígitos y nada más.

Grupos y capturas

Los paréntesis agrupan parte de un patrón para que un cuantificador o una alternativa se aplique a ella: (ab)+ repite «ab», y (jpg|png) coincide con cualquiera de las dos palabras. Un grupo normal también captura el texto coincidente, que puedes reutilizar en un reemplazo como $1, $2, etc.

Los grupos con nombre, como (?<year>\d{4}), hacen que los patrones sean más fáciles de leer y se pueden referenciar como $<year>. Si solo necesitas agrupar, un grupo sin captura (?:...) evita crear una captura que no se usa. El Probador de RegEx de LeedyBox lista cada coincidencia con sus grupos de captura y previsualiza los reemplazos.

Flags

Los flags cambian el comportamiento de todo el patrón. Los flags habituales de JavaScript son:

  • g (global): busca todas las coincidencias en lugar de solo la primera.
  • i (ignore case): trata las mayúsculas y las minúsculas como iguales.
  • m (multiline): ^ y $ coinciden en cada salto de línea.
  • s (dotAll): . también coincide con los saltos de línea.
  • u (unicode): activa la coincidencia compatible con Unicode y las clases \p{...}.

JavaScript también tiene y (sticky) y d (índices de coincidencia), que el probador también admite.

Codicioso frente a perezoso, y retroceso catastrófico

Los cuantificadores son codiciosos por defecto: coinciden con todo lo posible y después devuelven caracteres si el resto del patrón falla. En el texto <b>bold</b>, el patrón <.+> coincide con toda la cadena. Añadir ? hace que el cuantificador sea perezoso, de modo que <.+?> coincide solo con <b>. Una clase negada como <[^>]+> suele ser más clara y rápida.

La mayoría de los motores de regex, incluido el de JavaScript, usan retroceso (backtracking). Los cuantificadores anidados como (a+)+$ o las alternativas que se solapan pueden hacer que el motor pruebe un número enorme de combinaciones cuando una coincidencia falla, lo que puede bloquear una página o un servidor. Esto se conoce como retroceso catastrófico y, con entradas no fiables, puede aprovecharse para ataques de denegación de servicio (ReDoS). Evita anidar cuantificadores sobre los mismos caracteres, prefiere clases concretas a .* y prueba los patrones con entradas largas que no coincidan.

Las variantes de regex difieren

No existe un único estándar de regex. JavaScript, Python, Java, .NET, PCRE (que usa PHP), Go y las bases de datos admiten cada uno una sintaxis ligeramente distinta. Varían el lookbehind, los cuantificadores posesivos, la sintaxis de los grupos con nombre, las clases Unicode y la sintaxis de reemplazo. El motor RE2 de Go, por ejemplo, no admite lookaround ni referencias inversas.

El Probador de RegEx de LeedyBox usa el motor JavaScript de tu navegador. Un patrón que funciona ahí puede necesitar cambios en otro lenguaje, así que vuelve a probarlo donde se vaya a ejecutar.

Preguntas frecuentes

¿Por qué mi patrón solo coincide con la primera aparición?

Sin el flag g, JavaScript se detiene tras la primera coincidencia. Activa g para encontrar todas las coincidencias.

¿Puede una regex validar direcciones de correo electrónico?

Una regex puede comprobar que un valor parece plausible, pero no puede confirmar que una dirección exista. Enviar un correo de confirmación es la forma habitual de verificarla.

¿Por qué ^ coincide solo una vez en un texto de varias líneas?

Por defecto, ^ y $ se refieren a toda la entrada. Activa el flag m para que coincidan al inicio y al final de cada línea.