Hoja de trucos de Regex: patrones, banderas y ejemplos del mundo real
Una hoja de trucos práctica de expresiones regulares con clases de caracteres, cuantificadores, anclajes, grupos, alternativas, banderas y patrones probados para tareas cotidianas.
· 5 min de lectura
Las expresiones regulares son un lenguaje compacto para describir el texto. Una sola línea puede validar la entrada, extraer datos de los registros o cambiar el nombre de cientos de archivos. La sintaxis es densa, sin embargo, y pequeños errores producen patrones que casi funcionan. Esta hoja de trucos recoge la sintaxis que usarás diariamente, explica las partes que hacen tropezar a la gente, y termina con patrones probados que puedes adaptar. Todos los ejemplos utilizan la sintaxis de JavaScript, que también está muy cerca de Python, Java, Go y .NET.
Pruebe cada patrón en un [testador de regex](/herramientas/testador de regex) mientras lee; ver coincidencias resaltadas es la forma más rápida de construir intuición.
Personajes literales y escapar
La mayoría de los personajes coinciden entre sí: cat coincide con "gato". Doce caracteres tienen un significado especial y deben ser eliminados con una barra de retroceso para que coincidan literalmente:
. * + ? ^ $ { } ( ) | [ ] \ /
Así que 3.14 coincide con "3.14" pero también "3x14", mientras que 3\.14 coincide sólo "3.14".
Clases de caracteres
| El patrón | Las cerillas |
|---|---|
. |
Cualquier carácter excepto una línea nueva (a menos que se establezca el símbolo s) |
\d |
Un dígito 09 |
\w |
Un carácter de palabra: letra, dígito o subrayado |
\s |
Espacio en blanco: espacio, pestaña, línea nueva |
\D, \W, \S |
Lo contrario de lo anterior |
[abc] |
Uno de a, b o c |
[a-z] |
Cualquier letra ASCII en minúscula |
[^0-9] |
Cualquier carácter que no sea un dígito |
\p{L} |
Cualquier letra en cualquier escritura (requiere la bandera u) |
Dentro de paréntesis cuadrados, la mayoría de los caracteres especiales pierden su significado. [.] coincide con un punto literal. Un guión es literal cuando se coloca primero o último: [-a-z].
Cuantificadores
| El patrón | Significado |
|---|---|
a* |
Cero o más |
a+ |
Uno o más |
a? |
Cero o uno (opcional) |
a{3} |
Exactamente tres . |
a{2,5} |
Entre las dos y las cinco . |
a{2,} |
Dos o más |
Los cuantificadores son ** codiciosos **: coinciden tanto como sea posible y luego retroceden. Agregar ? los hace perezosos. Dado <b>bold</b>, el patrón <.+> coincide con toda la cadena, mientras que <.+?> coincide solo con <b>.
Anclas y límites
^coincide con el comienzo de la cadena, o de cada línea con la banderam.$coincide con el final de la cadena, o de cada línea conm.\bcorresponde a un límite de palabra: la posición entre un carácter de palabra y un carácter no-palabra.
\bcat\b coincide con "gato" en "el gato se sentó" pero no en "concatenado". Los anclajes son esenciales para la validación: \d{5} encuentra cinco dígitos en cualquier lugar de "abc123456", mientras que ^\d{5}$ requiere que toda la entrada sea exactamente de cinco dígitos.
Grupos y alternancia
(abc)grupos y capturas. El texto capturado está disponible como$1,$2en reemplazos.- Grupos
(?:abc)sin capturar, que es más rápido y mantiene la numeración limpia. (?<year>\d{4})es un grupo con nombre, accesible comomatch.groups.year.a|bcoincide con a o b. La alternancia tiene la prioridad más baja, así que^cat|dog$significa "comienza con gato" o "acaba con perro". Usa^(?:cat|dog)$para que coincida exactamente con una de las palabras.\1es una referencia al grupo 1:(\w)\1encuentra letras dobladas como "ll" en "hola".
Mira por ahí.
Los miradores afirman que algo está o no está al lado de la posición actual sin consumir caracteres.
| El patrón | Significado |
|---|---|
(?=...) |
Positivo: seguido de |
(?!...) |
Visión negativa: no seguida de |
(?<=...) |
Positive lookbehind: precedido por |
(?<!...) |
Negative lookbehind: no está precedido por |
Ejemplos: \d+(?=px) coincide con el número en "16px" sin "px"; (?<=\$)\d+ coincide con la cantidad después de un signo de dólar; ^(?!.*password).*$ coincide con las líneas que no contienen "contraseña".
Banderas
g(global): encontrar todas las coincidencias en lugar de detenerse en el primero.i(ignorar la letra):acoincide con "A".m(multilinea):^y$coinciden en las rupturas de línea.s(dotAll):.también coincide con las nuevas líneas.u(unicodo): trata los pares sustitutos como emoji como caracteres únicos y permite\p{...}.y(adhesivo): coincide solo en la posición donde terminó el último partido.
Modelos para las tareas cotidianas
Estas son prácticas en lugar de exhaustivas. La validación real debe combinarse con las comprobaciones del lado del servidor.
** Correo electrónico (pragmático):**
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Captura errores tipográficos como una falta de @ o dominio; la única validación real es enviar un correo electrónico de confirmación.
** URL de la babosa: **
^[a-z0-9]+(?:-[a-z0-9]+)*$
Fecha ISO (Año Año Año-MM-DD):
^(?<year>\d{4})-(?<month>0[1-9]|1[0-2])-(?<day>0[1-9]|[12]\d|3[01])$
Esto comprueba la forma y los rangos, pero no si existe el 31 de febrero; analice la fecha para confirmar.
Color hex:
^#(?:[0-9a-fA-F]{3}){1,2}$
Dirección IPv4:
^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)$
** Versión semántica:**
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?$
Control de contraseña fuerte (al menos 12 caracteres, una mayúscula, una minúscula y un dígito):
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$
** Recorte de espacios en blanco:** reemplazar ^\s+|\s+$ (con g) con una cadena vacía.
** Collapse espacios repetidos:** reemplazar {2,} con un solo espacio.
Extraer pares de claves=valores de una línea de registro:
(\w+)=("[^"]*"|\S+)
** camelCase a snake_case:** reemplazar ([a-z0-9])([A-Z]) con $1_$2, y luego minúscula el resultado. Para obtener más información sobre los estilos de nombramiento, vea camelCase vs snake_case.
Desempeño y retroceso catastrófico
Los motores Regex en JavaScript, Python y Java utilizan el retroceso. Algunos patrones obligan al motor a probar un número exponencial de combinaciones en entradas que casi coinciden. El ejemplo clásico es ^(a+)+$ contra "aaaaaaaaaaaaaaaaaaaa!". Cada "a" adicional duplica el trabajo, y unas pocas docenas de caracteres pueden congelar un servidor un vector de denegación de servicio conocido como ReDoS.
Para evitarlo:
- No se aniden cuantificadores sobre los mismos caracteres, como en
(a+)+o(\w*)*. - Hacer alternativas mutuamente excluyentes:
(a|ab)*es arriesgado; reestructurarlo. - Prefiere clases específicas sobre
.*:"[^"]*"es más seguro y más rápido que".*?". - Limite la longitud de entrada antes de hacer coincidir datos no confiables.
Consejos de legibilidad
- Construye patrones complejos de forma incremental y prueba cada pieza.
- Utilice grupos nombrados para que el código lea
m.groups.monthen lugar dem[2]. - Comenta patrones complicados en el código, o construye desde cadenas más pequeñas.
- Si un patrón necesita más de una o dos líneas, considere si un analizador pequeño sería más claro.
Resumen
Aprende las clases básicas, cuantificadores, anclajes, grupos y banderas y podrás leer la mayoría de los regexes que encuentres. Use cuantificadores perezosos y anclajes deliberadamente, busque alternativas cuando necesite contexto sin consumirlo, vigile cuantificadores anidados y siempre pruebe con ejemplos que coincidan y no coincidan antes de enviar un patrón.
Esta página se tradujo automáticamente del inglés. Si encuentras un error, avísanos.