Construye tu propio motor de expresiones regulares
Etapa 7 de 8v2 · 4e350638

Cuantificadores perezosos y reemplazo

Implementa repetición perezosa y expansión de capturas en reemplazos.

Constrúyelo en tu lenguaje

El tester trata tu programa como una caja negra: sirve cualquier lenguaje. Estos son los más cómodos para este proyecto.

Cuantificadores Perezosos (+?, *?) y Reemplazo de Texto

Por defecto, los cuantificadores son codiciosos. Añadir un signo de interrogación ? al cuantificador (+?, *?) lo convierte en perezoso (lazy): coincide con el menor número posible de caracteres necesarios. Además, la operación replace sustituye coincidencias interpolando grupos capturados ($1, $2).

Modelo mental: Cuantificador perezoso y sustitución con $N

  • <.+> sobre "<a><b>" (codicioso): coincide con "<a><b>" de extremo a extremo.
  • <.+?> sobre "<a><b>" (perezoso): coincide primero con "<a>" y luego con "<b>".
  • Sustitución con $1: si el grupo 1 capturó "a", el reemplazo "[$1]" produce "[a]".

Tu objetivo en esta etapa

Soportar cuantificadores perezosos y la operación op: "replace" con all: true y retro-referencias $1.

Formato de Entrada

json
{
  "op": "replace",
  "pattern": "<(.+?)>",
  "text": "<a><b>",
  "replacement": "[$1]",
  "all": true
}

Formato de Salida

json
{
  "text": "[a][b]"
}

Qué debes hacer paso a paso

  1. Implementa cuantificadores perezosos (+?, *?):
    • En lugar de consumir el máximo número de repeticiones primero, intenta primero con la cantidad mínima (1 para +?, 0 para *?) y solo incrementa repeticiones si el resto del patrón falla.
  2. Implementa la sustitución de grupos:
    • En replacement, sustituye $1 por el texto del grupo 1, $2 por el grupo 2, etc.
  3. Bucle de reemplazo global (all: true):
    • Encuentra todas las coincidencias disjuntas y sustitúyelas en orden.
  4. Emite la salida: Escribe {"text": textoReemplazado} en stdout.

Criterios de aceptación

  • ✅ Soporta cuantificadores no codiciosos/perezosos (+?, *?).
  • ✅ Sustituye variables de captura $1, $2 en la plantilla de reemplazo.

Formato de salida y errores

Los ejemplos multilínea se muestran así para facilitar la lectura. Emite JSON compacto, sin espacios opcionales, con las propiedades en el orden de los ejemplos de salida y un salto de línea final. No escribas logs en stdout. Las pruebas comparan texto exacto. Para entradas inválidas, usa stderr con la palabra error, stdout vacío y código 1. Para entradas válidas, código 0. Usa números JSON enteros cuando el resultado sea entero.

Reglas de sustitución

$0 representa la coincidencia completa; $1 a $9 representan capturas numeradas. Una referencia a un grupo que no existe se conserva literal: (a) sobre a con $1-$9 produce a-$9. Un grupo opcional existente que no participó aporta una cadena vacía. Con all: false, reemplaza solo la primera coincidencia; con all: true, recorre coincidencias no superpuestas de izquierda a derecha. Después de una coincidencia vacía, avanza un carácter para evitar un bucle infinito.