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.