Procesamiento de texto

El módulo text proporciona expresiones regulares, comparación y aplicación de parches de texto y división de documentos. Esta página es una referencia de API. Sus bloques cortos son llamadas aisladas; los bloques de división más largos son recetas parciales cuyos documentos, recursos de sistema de archivos configurados y procesamiento posterior pertenecen a la aplicación contenedora.

Carga

local text = require("text")

Expresiones regulares

text.regexp.compile

Compila una expresión regular compatible con RE2.

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

Devuelve: Regexp, error

re:match_string

Comprueba si una cadena coincide con la expresión compilada.

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

Devuelve: boolean

re:find_string

Busca la primera subcadena coincidente.

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

Devuelve: string | nil

En esta versión del runtime, una coincidencia de cadena vacía también se representa como nil; usa un patrón que consuma al menos un carácter cuando sea necesario distinguir una coincidencia vacía de la ausencia de coincidencia.

re:find_all_string

Busca todas las subcadenas coincidentes.

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

Devuelve: string[]

re:find_string_submatch

Busca la primera coincidencia y sus grupos de captura.

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)

re:find_all_string_submatch

Busca todas las coincidencias y sus grupos de captura.

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

Devuelve: string[][]

re:find_string_index

Busca los límites basados en 1 de la primera coincidencia.

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)

re:find_all_string_index

Busca los límites de todas las coincidencias.

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

Devuelve: table[] | nil (nil cuando no hay coincidencias)

re:replace_all_string

Reemplaza todas las subcadenas coincidentes.

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

re:split

Divide una cadena en las coincidencias de la expresión compilada.

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[]

re:num_subexp

Devuelve el número de subexpresiones de captura.

local count = re:num_subexp()

Devuelve: number

re:subexp_names

Devuelve los nombres de las subexpresiones de captura.

local names = re:subexp_names()

Devuelve: string[]

re:string

Devuelve la cadena del patrón compilado.

local pattern = re:string()

Devuelve: string

Comparación de texto

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

text.diff.new

Crea un comparador de texto con opciones predeterminadas o personalizadas.

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

diff:compare

Compara dos cadenas y devuelve las operaciones que transforman text1 en text2.

local diff, diff_err = text.diff.new()
if diff_err then
    return nil, diff_err
end
local diffs, err = diff:compare("hello world", "hello there")
if err then
    return nil, err
end

-- diffs contains:
-- {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"

diff:summarize

Cuenta los bytes UTF-8 sin cambios, insertados y eliminados. Para texto no ASCII, estos totales no son recuentos de puntos de código Unicode ni de grafemas.

-- `diffs` is the checked result from diff:compare.
local summary = diff:summarize(diffs)

-- summary.equals = 6 (bytes unchanged)
-- summary.deletions = 5 (bytes removed)
-- summary.insertions = 5 (bytes added)
Parámetro Tipo Descripción
diffs table Array de diff de compare

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

diff:pretty_text

Formatear diff con colores ANSI para visualizacion en terminal.

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

Devuelve: string, error

diff:pretty_html

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

local html, err = diff:pretty_html(diffs)
if err then
    return nil, err
end
-- `html` is an HTML fragment with equal, deleted, and inserted spans.
Parámetro Tipo Descripción
diffs table Array de diff de compare

Devuelve: string, error

diff:patch_make

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)
if err then
    return nil, err
end
Parámetro Tipo Descripción
text1 string Texto original
text2 string Texto modificado

Devuelve: table, error

diff:patch_apply

Aplica parches a una cadena y devuelve el resultado e indica si todos los parches se aplicaron correctamente.

local result, success = diff:patch_apply(patches, text1)
-- result = "The quick red fox jumps over the lazy cat"
-- success = true

Comprueba success antes de tratar result como la transformación solicitada. Pasa tablas de parches producidas por patch_make; en esta versión del runtime, el texto de parche serializado con formato incorrecto dentro de una tabla construida manualmente puede omitirse en vez de notificarse por separado.

Parámetro Tipo Descripción
patches table Parches de patch_make
text string Texto al cual aplicar parches

Devuelve: string, boolean

División de texto

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

text.splitter.recursive

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
})
if err then
    return nil, err
end

local long_text = "This is a long text that needs splitting..."
local chunks, split_err = splitter:split_text(long_text)
if split_err then
    return nil, split_err
end

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

text.splitter.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
})
if err then
    return nil, err
end

local readme = fs.get("app:docs"):readfile("README.md")
local chunks, err = splitter:split_text(readme)

Esta receta parcial requiere que la entrada habilite tanto text como fs, un recurso de sistema de archivos app:docs configurado y un archivo README.md legible dentro de ese recurso.

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
separators string[] nil Lista de separadores personalizada

splitter:split_text

Dividir un solo documento en un array de fragmentos.

local chunks, err = splitter:split_text(document)
if err then
    return nil, err
end

for i, chunk in ipairs(chunks) do
    -- Process each chunk (e.g., create embedding, send to LLM)
    process(chunk)
end

Aquí, splitter es un divisor creado correctamente, mientras que document y process son proporcionados por la aplicación.

Parámetro Tipo Descripción
text string Texto a dividir

Devuelve: string[], error

splitter:split_batch

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.

-- Input: pages from a PDF with page numbers
local pages = {
    {content = "First page content...", metadata = {page = 1}},
    {content = "Second page content...", metadata = {page = 2}}
}

local chunks, err = splitter:split_batch(pages)
if err then
    return nil, err
end

-- Output: each chunk knows which page it came from
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})

split_batch omite silenciosamente un elemento cuando este no es una tabla, falta su campo content, está vacío o no es una cadena, o falla la división de ese elemento. Aun así, devuelve los fragmentos restantes con un error nil. Valida cada elemento de entrada antes de la llamada y comprueba en el código de la aplicación cualquier requisito de cardinalidad; no trates una llamada correcta como prueba de que se representaron todas las entradas.

Errores

Condición Tipo Reintentable
Sintaxis de patrón no válida errors.INVALID no
Error interno errors.INTERNAL no

Consulta Manejo de errores para trabajar con errores.