Golf de regex2 cazas jugables incluidas

Estrategias de golf de regex: cómo superar el par

Siete técnicas para escribir la regex más corta que atrape a todos los objetivos y deje libres a los demás, con tableros interactivos que puedes resolver en el propio artículo.

Logo de Regex Hunter

· 6 min de lectura

/^c.*t/

atrapa

  • cart
  • chart
  • coat

deja libre

  • scat
  • crab

El golf de regex es un juego sencillo: recibes dos listas de palabras. Escribe la expresión regular más corta que coincida con todo lo de la primera lista (los monstruos) y con nada de la segunda (los inocentes). Cada carácter cuenta, y cada tablero tiene un par: la longitud que hay que superar.

El truco es que el golf de regex no se trata tanto de sintaxis como de ver. Aquí tienes siete hábitos que separan una respuesta de 28 caracteres de una de 5. Todos los ejemplos son interactivos: escribe en los tableros o pulsa Probar para abrir el patrón en la Zona de pruebas.

01Describe la diferencia, no las palabras

El instinto del principiante es describir a los monstruos. El del golfista es encontrar lo más pequeño que solo tienen en común los monstruos.

Comparación82 % más corto

Tablerocat · cart · chart · coat · cast vs act · arc · tack · scat · crab

  1. listarlaslo resuelve28
    /^(cat|cart|chart|coat|cast)$/
  2. factorizarlo resuelve20
    /^c(a|ar|har|oa|as)t$/
  3. la diferencialo resuelve5
    /^c.*t/
Probar el más corto
El mismo tablero, tres respuestas. La ganadora no describe las palabras en absoluto: solo las separa.

Los cinco monstruos empiezan por c y tienen una t en algún punto después. Ninguno de los inocentes cumple eso. Esa observación vale 23 caracteres.

La escalera del recorte: listar las palabras cuesta 28 caracteres, factorizar 20 y describir la diferencia 5

02Las anclas son el filtro más barato que tienes

^ y $ cuestan un carácter cada una y pueden eliminar grupos enteros de inocentes. Mira lo que pasa si quitamos el ^ de la respuesta anterior:

Coincidencias4/6 como se esperaba
/c.*t/

Debe coincidir3/3

  • cat
  • chart
  • coast

No debe1/3

  • act
  • scat
  • crab
Pruébalo en la Zona de pruebas
Sin el ancla ^, “act” y “scat” se cuelan: las dos contienen una c seguida, más adelante, de una t.

Dos caracteres de anclas casi siempre salen más baratos que hacer más listo el resto del patrón. Cuando un tablero se divide por posición (cómo empiezan o terminan las palabras), recurre primero a las anclas.

03Busca, no hagas coincidir todo

El golf de regex usa semántica de búsqueda: tu patrón solo tiene que coincidir en algún lugar de la palabra, no con la palabra entera. Así que no hace falta envolverlo todo en ^…$ ni rellenar con .*:

En vez de Escribe Ahorras
^.*ing$ ing$ 3
.*foo.* foo 4
^(a|b) ^[ab] 1

Los .* al principio y al final son puro relleno. (El panel de diagnóstico de Regex Hunter los señala justo por eso.)

04Gasta tus caracteres donde cuentan

Muchas funciones de las regex tienen una forma corta y una larga. Los golfistas siempre eligen la corta:

Larga Corta Ahorras
[0-9] \d 3
[A-Za-z0-9_] \w 10
(a|b|c) [abc] 2
.{2} .. 2
aa* a+ 1
(?:ab)+ (ab)+ 2

Los grupos sin captura son buena higiene en código de producción, y caracteres desperdiciados en el golf.

05Deja que las referencias inversas vean los patrones por ti

Cuando los monstruos comparten una forma en lugar de letras concretas (una letra doble, un trozo repetido), una referencia inversa (backreference) hace el trabajo. (.) captura cualquier carácter; \1 exige ese mismo carácter otra vez.

Patrón5 car.
/(.)\1/
Pruébalo en la Zona de pruebas
“Cualquier carácter y luego ese mismo carácter otra vez”: una letra doble en cualquier punto de la palabra.

Pruébalo en un tablero. El par es la longitud de ese patrón:

Caza jugablepar 5

Atrapa las palabras con una letra doble.

Objetivos · 0/5 atrapados

  • bookobjetivo
  • letterobjetivo
  • coffeeobjetivo
  • balloonobjetivo
  • grassobjetivo

Inocentes · 0 errores

  • bakeinocente
  • paperinocente
  • stoneinocente
  • orangeinocente
  • tigerinocente

Escribe una regex: el tablero se actualiza mientras escribes.

Pruébalo en la Zona de pruebas
¿Te gustó? Cada día llega una nueva.Jugar la caza de hoy

06Espacio negativo: di lo que no puede estar

A veces a los monstruos los define lo que les falta. Hay dos formas de decir “ninguna e en ninguna parte”, y una es más corta:

Comparación13 % más corto

Tableromoon · ask · dog · trunk · swift vs tree · eagle · green · apple · code

  1. lookaheadlo resuelve8
    /^(?!.*e)/
  2. clase negadalo resuelve7
    /^[^e]*$/
Probar el más corto
Las dos funcionan. La clase de caracteres negada es un carácter más corta que el lookahead: pruébala antes de recurrir a (?!…).

Los lookaheads se ganan el sueldo cuando necesitas varias condiciones a la vez (“tiene un dígito y ningún espacio”). Para una sola letra ausente, gana la clase negada.

07Cuando no hay nada en común, cubre el conjunto

Algunos tableros no tienen una única regla elegante. Entonces el juego se convierte en un puzzle de cobertura: encuentra unos cuantos fragmentos diminutos (j, bu, a.a) que atrapen cada uno a algunos monstruos y a ningún inocente, y únelos con |. Así funciona exactamente el famoso solucionador de Peter Norvig; lo contamos en El golf de regex de xkcd: el puzzle detrás del cómic 1313.

08Pruébalo

Un tablero más. Los monstruos comparten una estructura, y los inocentes están elegidos para castigar las respuestas obvias: (.)\1 atrapa las palabras equivocadas, y (.).\1 atrapa casi todo. ¿Puedes llegar al par?

Caza jugablepar 6

Atrapa las palabras que contienen un trozo de dos letras repetido.

Objetivos · 0/5 atrapados

  • bananaobjetivo
  • papayaobjetivo
  • cocoaobjetivo
  • dodoobjetivo
  • hahaobjetivo

Inocentes · 0 errores

  • abbainocente
  • llamainocente
  • saladinocente
  • tattooinocente
  • cheeseinocente

Escribe una regex: el tablero se actualiza mientras escribes.

Pruébalo en la Zona de pruebas
¿Te gustó? Cada día llega una nueva.Jugar la caza de hoy

09Sigue jugando