El fichero tenía ciento y pico líneas de clave = valor, arrastrado de tres despliegues anteriores: comentarios, líneas en blanco, claves con punto y algún separador raro que puso alguien que ya no está. Quería una función pequeña que devolviera un objeto. Diez líneas de JavaScript y una expresión regular.
La escribí a ojo: ^(\s*\w+\s*)+=\s*(.*)$. Con los primeros veinte ejemplos, perfecta. Al pasarle el fichero entero, la pestaña se quedó pensando y ya no volvió. Sin excepción, sin traza, sin nada.
El problema no era la línea: era la ambigüedad
La que la mata es una línea sin igual. Un comentario largo, por ejemplo. Mientras hay un =, el motor encuentra su camino y sale. Cuando no lo hay, tiene que probar todas las formas posibles de repartir esos caracteres entre el grupo repetido y los espacios de dentro, y son muchísimas: \s* dentro de un grupo con + significa que cada posición se puede cortar de varias maneras. El coste crece de forma exponencial con la longitud de la línea.
El patrón no estaba mal por torpeza. Estaba mal por ambiguo, que es peor, porque no se ve leyéndolo.
Lo que acabé montando
En vez de parchear la regular y seguir, dediqué el rato a un banco de pruebas de treinta líneas:
- Pegas tus líneas reales, escribes el patrón y ves qué casa, qué no y con qué grupos.
- Cada evaluación corre en un Worker con corte: si no termina, se mata y se marca la línea culpable en rojo. El cuelgue deja de ser silencio y pasa a ser un dato.
- Un aviso estático tonto pero útil: cuantificador dentro de un grupo cuantificado.
La IA, corriendo ahí mismo, hizo dos cosas. Desambiguar el patrón: ^\s*([A-Za-z_][\w.]*)\s*=\s*(.*)$ — un identificador, no una repetición de grupos. Y escribir los casos que yo no me habría molestado en escribir: línea sin igual, línea con dos, clave con punto, valor vacío, valor con almohadilla dentro de comillas.
Lo caro de una expresión regular no es escribirla. Es enterarte de con qué entrada se atraganta.
Por qué no salió nada de aquí
Las líneas de prueba no eran de juguete: eran las variables de un despliegue de verdad, con una URL interna, un usuario de base de datos y un token que caducaba esa semana. Ese es justo el material que hay que pegar para que el patrón sirva de algo, y justo el que no vas a subir a un tester online ni mandar dentro de un prompt.
Aquí el modelo corre en el navegador, sobre tu propia GPU: las líneas y la pregunta se quedan en la pestaña. No hay que anonimizar nada antes de pegarlo, que suele ser la parte en la que uno se rinde y acaba haciéndolo a mano y mal.
Abre Elffuss Code y pega tus líneas feas de verdad: todo corre en tu navegador, así que nada de lo que pegues sale de tu equipo.
Abrir Code →