Construye tu propio motor de expresiones regulares
Etapa 6 de 8v3 · 4bd8ec77

Capturas

Registra el texto y los límites de cada grupo durante backtracking.

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.

Grupos de Captura (Capture Groups)

Los paréntesis en expresiones regulares no solo agrupan sintácticamente, sino que también capturan el texto coincidente de cada par de paréntesis para su posterior extracción.

Modelo mental: Vector de capturas indexadas

Los grupos de captura se indexan según el orden en que abren sus paréntesis (:

  • Para el patrón (a+)(b) sobre "zaaab":
    • Coincidencia total en el texto: "aaab" (span: [1, 5]).
    • Grupo 1 (a+): "aaa".
    • Grupo 2 (b): "b".
    • groups: ["aaa", "b"].

Tu objetivo en esta etapa

Capturar las subcadenas correspondientes a cada grupo entre paréntesis y devolverlas en el arreglo groups.

Formato de Entrada

json
{
  "op": "search",
  "pattern": "(a+)(b)",
  "text": "zaaab"
}

Formato de Salida

json
{
  "matched": true,
  "span": [1, 5],
  "groups": ["aaa", "b"]
}

Qué debes hacer paso a paso

  1. Registra los inicios y fines de cada grupo:
    • Durante la coincidencia, guarda el índice de inicio del texto cuando se entra a un ( y el índice final cuando se cierra ).
  2. Extrae las subcadenas:
    • Al completar la coincidencia, extrae text.slice(inicio, fin) para cada grupo en orden de aparición de sus paréntesis.
  3. Emite la salida: Escribe {"matched": true, "span": span, "groups": groups} en stdout.

Criterios de aceptación

  • ✅ Devuelve las subcadenas capturadas en groups.
  • ✅ Preserva el orden posicional de los grupos según su paréntesis de apertura.

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.

Un grupo opcional que no participa se representa con null en groups. Un grupo que participa y captura cero caracteres se representa con "". Numera grupos por apertura, incluidos los anidados; si un grupo se repite, devuelve su última captura. Los intervalos son de inicio inclusivo y fin exclusivo.