Processamento de Texto

Expressoes regulares, diff de texto e divisao semantica de texto.

Carregamento

local text = require("text")

Expressoes Regulares

Compilar

local re, err = text.regexp.compile("[0-9]+")
Parâmetro Tipo Descrição
pattern string Padrão regex compativel com RE2

Retorna: Regexp, error

Match

local ok = re:match_string("abc123")
Parâmetro Tipo Descrição
s string String para match

Retorna: boolean

Find

local match = re:find_string("abc123def")
Parâmetro Tipo Descrição
s string String para buscar

Retorna: string | nil

Find All

local matches = re:find_all_string("a1b2c3")
Parâmetro Tipo Descrição
s string String para buscar

Retorna: string[]

Find com Grupos

local match = re:find_string_submatch("user@example.com")
Parâmetro Tipo Descrição
s string String para buscar

Retorna: string[] | nil (match completo + grupos de captura)

Find All com Grupos

local matches = re:find_all_string_submatch("a=1 b=2")
Parâmetro Tipo Descrição
s string String para buscar

Retorna: string[][]

Find Index

local pos = re:find_string_index("abc123")
Parâmetro Tipo Descrição
s string String para buscar

Retorna: table | nil ({inicio, fim}, base 1)

Find All Index

local positions = re:find_all_string_index("a1b2c3")
Parâmetro Tipo Descrição
s string String para buscar

Retorna: table[]

Replace

local result = re:replace_all_string("a1b2", "X")
Parâmetro Tipo Descrição
s string String de entrada
repl string String de substituicao

Retorna: string

Split

local parts = re:split("a,b,c", -1)
Parâmetro Tipo Descrição
s string String para dividir
n integer Max partes, -1 para todas

Retorna: string[]

Contagem de Subexpressoes

local count = re:num_subexp()

Retorna: number

Nomes de Subexpressoes

local names = re:subexp_names()

Retorna: string[]

String do Padrão

local pattern = re:string()

Retorna: string

Diff de Texto

Compare versoes de texto e gere patches. Baseado em go-diff (diff-match-patch do Google).

Criar Differ

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

Retorna: Differ, error

Opções {id="diff-options"}

Campo Tipo Padrão Descrição
diff_timeout number 1.0 Timeout em segundos
diff_edit_cost integer 4 Custo de uma edicao vazia
match_threshold number 0.5 Tolerancia de match 0-1
match_distance integer 1000 Distancia para buscar match
patch_delete_threshold number 0.5 Threshold de delete
patch_margin integer 4 Margem de contexto

Compare

Encontra diferencas entre dois textos. Retorna um array de operações descrevendo como transformar text1 em text2.

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

-- diffs contem:
-- {operation = "equal", text = "hello "}
-- {operation = "delete", text = "world"}
-- {operation = "insert", text = "there"}
Parâmetro Tipo Descrição
text1 string Texto original
text2 string Texto modificado

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

Operações: "equal", "delete", "insert"

Summarize

Conta caracteres alterados entre versoes.

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

-- summary.equals = 6 (caracteres inalterados)
-- summary.deletions = 5 (caracteres removidos)
-- summary.insertions = 5 (caracteres adicionados)
Parâmetro Tipo Descrição
diffs table Array de diff do compare

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

Pretty Text

Formata diff com cores ANSI para exibicao em terminal.

local formatted, err = diff:pretty_text(diffs)
print(formatted)
Parâmetro Tipo Descrição
diffs table Array de diff do compare

Retorna: string, error

Pretty HTML

Formata diff como HTML com tags <del> e <ins>.

local html, err = diff:pretty_html(diffs)
-- Retorna: "hello <del>world</del><ins>there</ins>"
Parâmetro Tipo Descrição
diffs table Array de diff do compare

Retorna: string, error

Criar Patches

Gera patches que podem ser aplicados para transformar um texto em outro. Patches podem ser serializados e aplicados depois.

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 Descrição
text1 string Texto original
text2 string Texto modificado

Retorna: table, error

Aplicar Patches

Aplica patches para transformar texto. Retorna o resultado e se todos os patches foram aplicados com sucesso.

local result, success = diff:patch_apply(patches, text1)
-- result = "The quick red fox jumps over the lazy cat"
-- success = true
Parâmetro Tipo Descrição
patches table Patches de patch_make
text string Texto para aplicar patches

Retorna: string, boolean

Divisao de Texto

Divide documentos grandes em chunks menores preservando limites semanticos. Baseado no text splitter do langchaingo.

Splitter Recursivo

Divide texto usando uma hierarquia de separadores. Primeiro tenta dividir em duas quebras de linha (paragrafos), depois quebra simples, depois espacos, depois caracteres. Usa separadores menores quando chunks excedem o limite de tamanho.

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

local long_text = "Este e um texto longo que precisa ser dividido..."
local chunks, err = splitter:split_text(long_text)
-- chunks = {"Este e um texto...", "...longo que precisa...", "...ser dividido..."}

Retorna: Splitter, error

Opções {id="recursive-splitter-options"}

Campo Tipo Padrão Descrição
chunk_size integer 4000 Max caracteres por chunk
chunk_overlap integer 200 Caracteres repetidos entre chunks adjacentes
keep_separator boolean false Manter separadores na saida
separators string[] nil Lista customizada de separadores

Splitter Markdown

Divide documentos markdown respeitando a estrutura. Tenta manter headings com seu conteudo, blocos de código intactos e linhas de tabela 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)

Retorna: Splitter, error

Opções {id="markdown-splitter-options"}

Campo Tipo Padrão Descrição
chunk_size integer 4000 Max caracteres por chunk
chunk_overlap integer 200 Caracteres repetidos entre chunks adjacentes
code_blocks boolean false Manter blocos de código juntos
reference_links boolean false Preservar links de referência
heading_hierarchy boolean false Respeitar niveis de heading
join_table_rows boolean false Manter linhas de tabela juntas

Split Text

Divide um único documento em um array de chunks.

local chunks, err = splitter:split_text(document)

for i, chunk in ipairs(chunks) do
    -- Processa cada chunk (ex: criar embedding, enviar para LLM)
    process(chunk)
end
Parâmetro Tipo Descrição
text string Texto para dividir

Retorna: string[], error

Split Batch

Divide multiplos documentos preservando seus metadados. Cada documento de entrada pode produzir multiplos chunks de saida. Todos os chunks herdam os metadados do documento fonte.

-- Entrada: paginas de um PDF com numeros de pagina
local pages = {
    {content = "Conteudo da primeira pagina...", metadata = {page = 1}},
    {content = "Conteudo da segunda pagina...", metadata = {page = 2}}
}

local chunks, err = splitter:split_batch(pages)

-- Saida: cada chunk sabe de qual pagina veio
for _, chunk in ipairs(chunks) do
    print("Pagina " .. chunk.metadata.page .. ": " .. chunk.content:sub(1, 50))
end
Parâmetro Tipo Descrição
pages table Array de {content, metadata}

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

Erros

Condição Tipo Retentável
Sintaxe de padrão invalida errors.INVALID não
Erro interno errors.INTERNAL não

Veja Error Handling para trabalhar com erros.