Construye tu propio motor de expresiones regulares
Etapa 5 de 8v2 · 6a450085

Clases y grupos

Añade clases, rangos, negación y grupos para controlar precedencia.

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.

Clases de Caracteres ([abc], [A-Z], [^0-9]) y Agrupación

Las clases de caracteres entre corchetes coinciden con un único carácter de un conjunto:

  • Rangos: [a-z], [0-9], [A-C].
  • Negadas: [^0-9] (coincide con cualquier carácter que no sea dígito).
  • Agrupación con paréntesis: ([A-C][^0-9])+ permite aplicar cuantificadores a secuencias complejas.

Modelo mental: Conjunto de predicados por carácter

Una clase [A-C][^0-9]:

  • Primer átomo: [A-C] -> carácter entre 'A' y 'C'.
  • Segundo átomo: [^0-9] -> cualquier carácter que no esté entre '0' y '9'.
  • Paréntesis (...)+: Agrupa los dos átomos anteriores para que el cuantificador + repita la pareja completa.

Tu objetivo en esta etapa

Soportar clases de caracteres positivas, con rangos, negadas y grupos con cuantificadores.

Formato de Entrada

json
{
  "op": "search",
  "pattern": "([A-C][^0-9])+",
  "text": "xxAbCz7"
}

Formato de Salida

json
{
  "matched": true,
  "span": [2, 6]
}

Qué debes hacer paso a paso

  1. Parsea clases [...]:
    • Si inicia con ^: es negada.
    • Detecta rangos x-y comparando códigos de carácter (char >= 'A' && char <= 'C').
  2. Parsea grupos (...):
    • Trata el contenido entre paréntesis como un sub-patrón compuesto.
  3. Aplica cuantificadores sobre grupos o clases.
  4. Emite la salida: Escribe el resultado en stdout.

Criterios de aceptación

  • ✅ Interpreta clases simples y rangos alfanuméricos.
  • ✅ Interpreta clases negadas ([^...]).
  • ✅ Agrupa sub-expresiones con paréntesis y permite cuantificarlas.

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.