Procesamiento de Texto

Expresiones regulares, comparacion de texto y division semantica de texto.

Carga

local text = require("text")

Expresiones Regulares

Compilar

local re, err = text.regexp.compile("[0-9]+")
Parámetro Tipo Descripción
pattern string Patrón regex compatible con RE2

Devuelve: Regexp, error

Coincidencia

local ok = re:match_string("abc123")
Parámetro Tipo Descripción
s string String a comparar

Devuelve: boolean

Buscar

local match = re:find_string("abc123def")
Parámetro Tipo Descripción
s string String a buscar

Devuelve: string | nil

Buscar Todas

local matches = re:find_all_string("a1b2c3")
Parámetro Tipo Descripción
s string String a buscar

Devuelve: string[]

Buscar con Grupos

local match = re:find_string_submatch("user@example.com")
Parámetro Tipo Descripción
s string String a buscar

Devuelve: string[] | nil (coincidencia completa + grupos de captura)

Buscar Todas con Grupos

local matches = re:find_all_string_submatch("a=1 b=2")
Parámetro Tipo Descripción
s string String a buscar

Devuelve: string[][]

Buscar Indice

local pos = re:find_string_index("abc123")
Parámetro Tipo Descripción
s string String a buscar

Devuelve: table | nil ({start, end}, basado en 1)

Buscar Todos los Indices

local positions = re:find_all_string_index("a1b2c3")
Parámetro Tipo Descripción
s string String a buscar

Devuelve: table[]

Reemplazar

local result = re:replace_all_string("a1b2", "X")
Parámetro Tipo Descripción
s string String de entrada
repl string String de reemplazo

Devuelve: string

Dividir

local parts = re:split("a,b,c", -1)
Parámetro Tipo Descripción
s string String a dividir
n integer Partes maximas, -1 para todas

Devuelve: string[]

Conteo de Subexpresiones

local count = re:num_subexp()

Devuelve: number

Nombres de Subexpresiones

local names = re:subexp_names()

Devuelve: string[]

String de Patrón

local pattern = re:string()

Devuelve: string

Comparacion de Texto

Comparar versiones de texto y generar parches. Basado en go-diff (diff-match-patch de Google).

Crear Comparador

local diff, err = text.diff.new()
local diff, err = text.diff.new(options)

Devuelve: Differ, error

Opciones {id="diff-options"}

Campo Tipo Predeterminado Descripción
diff_timeout number 1.0 Timeout en segundos
diff_edit_cost integer 4 Costo de una edicion vacia
match_threshold number 0.5 Tolerancia de coincidencia 0-1
match_distance integer 1000 Distancia a buscar para coincidencia
patch_delete_threshold number 0.5 Umbral de eliminacion
patch_margin integer 4 Margen de contexto

Comparar

Encontrar diferencias entre dos textos. Devuelve un array de operaciones describiendo como transformar text1 en text2.

local diff, _ = text.diff.new()
local diffs, err = diff:compare("hello world", "hello there")

-- diffs contiene:
-- {operation = "equal", text = "hello "}
-- {operation = "delete", text = "world"}
-- {operation = "insert", text = "there"}
Parámetro Tipo Descripción
text1 string Texto original
text2 string Texto modificado

Devuelve: table, error (array de {operation, text})

Operaciones: "equal", "delete", "insert"

Resumir

Contar caracteres cambiados entre versiones.

local diffs, _ = diff:compare("hello world", "hello there")
local summary = diff:summarize(diffs)

-- summary.equals = 6 (caracteres sin cambiar)
-- summary.deletions = 5 (caracteres eliminados)
-- summary.insertions = 5 (caracteres agregados)
Parámetro Tipo Descripción
diffs table Array de diff de compare

Devuelve: table ({insertions, deletions, equals})

Texto Formateado

Formatear diff con colores ANSI para visualizacion en terminal.

local formatted, err = diff:pretty_text(diffs)
print(formatted)
Parámetro Tipo Descripción
diffs table Array de diff de compare

Devuelve: string, error

HTML Formateado

Formatear diff como HTML con tags <del> e <ins>.

local html, err = diff:pretty_html(diffs)
-- Devuelve: "hello <del>world</del><ins>there</ins>"
Parámetro Tipo Descripción
diffs table Array de diff de compare

Devuelve: string, error

Crear Parches

Generar parches que pueden aplicarse para transformar un texto en otro. Los parches pueden serializarse y aplicarse despues.

local text1 = "The quick brown fox jumps over the lazy dog"
local text2 = "The quick red fox jumps over the lazy cat"

local patches, err = diff:patch_make(text1, text2)
Parámetro Tipo Descripción
text1 string Texto original
text2 string Texto modificado

Devuelve: table, error

Aplicar Parches

Aplicar parches para transformar texto. Devuelve el resultado y si todos los parches se aplicaron exitosamente.

local result, success = diff:patch_apply(patches, text1)
-- result = "The quick red fox jumps over the lazy cat"
-- success = true
Parámetro Tipo Descripción
patches table Parches de patch_make
text string Texto al cual aplicar parches

Devuelve: string, boolean

Division de Texto

Dividir documentos grandes en fragmentos mas pequenos preservando limites semanticos. Basado en el divisor de texto de langchaingo.

Divisor Recursivo

Divide texto usando una jerarquia de separadores. Primero intenta dividir en dobles nuevas lineas (parrafos), luego nuevas lineas simples, luego espacios, luego caracteres. Recurre a separadores mas pequenos cuando los fragmentos exceden el limite de tamano.

local splitter, err = text.splitter.recursive({
    chunk_size = 1000,
    chunk_overlap = 100
})

local long_text = "This is a long text that needs splitting..."
local chunks, err = splitter:split_text(long_text)
-- chunks = {"This is a long...", "...text that needs...", "...splitting..."}

Devuelve: Splitter, error

Opciones {id="recursive-splitter-options"}

Campo Tipo Predeterminado Descripción
chunk_size integer 4000 Caracteres maximos por fragmento
chunk_overlap integer 200 Caracteres repetidos entre fragmentos adyacentes
keep_separator boolean false Mantener separadores en salida
separators string[] nil Lista de separadores personalizada

Divisor de Markdown

Divide documentos markdown respetando la estructura. Intenta mantener encabezados con su contenido, bloques de código intactos y filas de tabla juntas.

local splitter, err = text.splitter.markdown({
    chunk_size = 2000,
    code_blocks = true,
    heading_hierarchy = true
})

local readme = fs.read("README.md")
local chunks, err = splitter:split_text(readme)

Devuelve: Splitter, error

Opciones {id="markdown-splitter-options"}

Campo Tipo Predeterminado Descripción
chunk_size integer 4000 Caracteres maximos por fragmento
chunk_overlap integer 200 Caracteres repetidos entre fragmentos adyacentes
code_blocks boolean false Mantener bloques de código juntos
reference_links boolean false Preservar enlaces de referencia
heading_hierarchy boolean false Respetar niveles de encabezado
join_table_rows boolean false Mantener filas de tabla juntas

Dividir Texto

Dividir un solo documento en un array de fragmentos.

local chunks, err = splitter:split_text(document)

for i, chunk in ipairs(chunks) do
    -- Procesar cada fragmento (ej., crear embedding, enviar a LLM)
    process(chunk)
end
Parámetro Tipo Descripción
text string Texto a dividir

Devuelve: string[], error

Dividir Lote

Dividir multiples documentos preservando sus metadatos. Cada documento de entrada puede producir multiples fragmentos de salida. Todos los fragmentos heredan los metadatos de su documento fuente.

-- Entrada: paginas de un PDF con numeros de pagina
local pages = {
    {content = "First page content...", metadata = {page = 1}},
    {content = "Second page content...", metadata = {page = 2}}
}

local chunks, err = splitter:split_batch(pages)

-- Salida: cada fragmento sabe de que pagina vino
for _, chunk in ipairs(chunks) do
    print("Page " .. chunk.metadata.page .. ": " .. chunk.content:sub(1, 50))
end
Parámetro Tipo Descripción
pages table Array de {content, metadata}

Devuelve: table, error (array de {content, metadata})

Errores

Condición Tipo Reintentable
Sintaxis de patrón invalida errors.INVALID no
Error interno errors.INTERNAL no

Consulte Manejo de Errores para trabajar con errores.