Textverarbeitung

Reguläre Ausdrücke, Text-Diffing und semantisches Text-Splitting.

Laden

local text = require("text")

Reguläre Ausdrücke

Kompilieren

local re, err = text.regexp.compile("[0-9]+")
Parameter Typ Beschreibung
pattern string RE2-kompatibles Regex-Muster

Gibt zurück: Regexp, error

Match

local ok = re:match_string("abc123")
Parameter Typ Beschreibung
s string Zu matchender String

Gibt zurück: boolean

Find

local match = re:find_string("abc123def")
Parameter Typ Beschreibung
s string Zu durchsuchender String

Gibt zurück: string | nil

Find All

local matches = re:find_all_string("a1b2c3")
Parameter Typ Beschreibung
s string Zu durchsuchender String

Gibt zurück: string[]

Find mit Gruppen

local match = re:find_string_submatch("user@example.com")
Parameter Typ Beschreibung
s string Zu durchsuchender String

Gibt zurück: string[] | nil (vollständiger Match + Capture-Gruppen)

Find All mit Gruppen

local matches = re:find_all_string_submatch("a=1 b=2")
Parameter Typ Beschreibung
s string Zu durchsuchender String

Gibt zurück: string[][]

Find Index

local pos = re:find_string_index("abc123")
Parameter Typ Beschreibung
s string Zu durchsuchender String

Gibt zurück: table | nil ({start, end}, 1-basiert)

Find All Index

local positions = re:find_all_string_index("a1b2c3")
Parameter Typ Beschreibung
s string Zu durchsuchender String

Gibt zurück: table[]

Ersetzen

local result = re:replace_all_string("a1b2", "X")
Parameter Typ Beschreibung
s string Eingabe-String
repl string Ersetzungs-String

Gibt zurück: string

Split

local parts = re:split("a,b,c", -1)
Parameter Typ Beschreibung
s string Zu teilender String
n integer Max Teile, -1 für alle

Gibt zurück: string[]

Unterausdrucks-Anzahl

local count = re:num_subexp()

Gibt zurück: number

Unterausdrucks-Namen

local names = re:subexp_names()

Gibt zurück: string[]

Muster-String

local pattern = re:string()

Gibt zurück: string

Text-Diffing

Textversionen vergleichen und Patches generieren. Basiert auf go-diff (Googles diff-match-patch).

Differ erstellen

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

Gibt zurück: Differ, error

Optionen {id="diff-options"}

Feld Typ Standard Beschreibung
diff_timeout number 1.0 Timeout in Sekunden
diff_edit_cost integer 4 Kosten einer leeren Bearbeitung
match_threshold number 0.5 Match-Toleranz 0-1
match_distance integer 1000 Distanz zur Match-Suche
patch_delete_threshold number 0.5 Lösch-Schwelle
patch_margin integer 4 Kontext-Rand

Vergleichen

Unterschiede zwischen zwei Texten finden. Gibt ein Array von Operationen zurück, die beschreiben, wie text1 in text2 transformiert wird.

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

-- diffs enthält:
-- {operation = "equal", text = "hello "}
-- {operation = "delete", text = "world"}
-- {operation = "insert", text = "there"}
Parameter Typ Beschreibung
text1 string Original-Text
text2 string Modifizierter Text

Gibt zurück: table, error (Array von {operation, text})

Operationen: "equal", "delete", "insert"

Zusammenfassen

Geänderte Zeichen zwischen Versionen zählen.

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

-- summary.equals = 6 (unveränderte Zeichen)
-- summary.deletions = 5 (entfernte Zeichen)
-- summary.insertions = 5 (hinzugefügte Zeichen)
Parameter Typ Beschreibung
diffs table Diff-Array von compare

Gibt zurück: table ({insertions, deletions, equals})

Pretty Text

Diff mit ANSI-Farben für Terminal-Anzeige formatieren.

local formatted, err = diff:pretty_text(diffs)
print(formatted)
Parameter Typ Beschreibung
diffs table Diff-Array von compare

Gibt zurück: string, error

Pretty HTML

Diff als HTML mit <del>- und <ins>-Tags formatieren.

local html, err = diff:pretty_html(diffs)
-- Gibt zurück: "hello <del>world</del><ins>there</ins>"
Parameter Typ Beschreibung
diffs table Diff-Array von compare

Gibt zurück: string, error

Patches erstellen

Patches generieren, die angewendet werden können, um einen Text in einen anderen zu transformieren. Patches können serialisiert und später angewendet werden.

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)
Parameter Typ Beschreibung
text1 string Original-Text
text2 string Modifizierter Text

Gibt zurück: table, error

Patches anwenden

Patches anwenden, um Text zu transformieren. Gibt das Ergebnis und ob alle Patches erfolgreich angewendet wurden zurück.

local result, success = diff:patch_apply(patches, text1)
-- result = "The quick red fox jumps over the lazy cat"
-- success = true
Parameter Typ Beschreibung
patches table Patches von patch_make
text string Text, auf den Patches angewendet werden

Gibt zurück: string, boolean

Text-Splitting

Große Dokumente in kleinere Chunks aufteilen, während semantische Grenzen erhalten bleiben. Basiert auf langchaingo Text-Splitter.

Rekursiver Splitter

Teilt Text mit einer Hierarchie von Trennzeichen. Versucht zuerst bei doppelten Zeilenumbrüchen (Absätze) zu teilen, dann einzelne Zeilenumbrüche, dann Leerzeichen, dann Zeichen. Fällt auf kleinere Trennzeichen zurück, wenn Chunks die Größenbegrenzung überschreiten.

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..."}

Gibt zurück: Splitter, error

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

Feld Typ Standard Beschreibung
chunk_size integer 4000 Max Zeichen pro Chunk
chunk_overlap integer 200 Zeichen wiederholt zwischen benachbarten Chunks
keep_separator boolean false Trennzeichen in Ausgabe behalten
separators string[] nil Benutzerdefinierte Trennzeichenliste

Markdown-Splitter

Teilt Markdown-Dokumente unter Beachtung der Struktur. Versucht Überschriften mit ihrem Inhalt zusammenzuhalten, Code-Blöcke intakt zu lassen und Tabellenzeilen zusammenzuhalten.

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)

Gibt zurück: Splitter, error

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

Feld Typ Standard Beschreibung
chunk_size integer 4000 Max Zeichen pro Chunk
chunk_overlap integer 200 Zeichen wiederholt zwischen benachbarten Chunks
code_blocks boolean false Code-Blöcke zusammenhalten
reference_links boolean false Referenz-Links erhalten
heading_hierarchy boolean false Überschriftenebenen beachten
join_table_rows boolean false Tabellenzeilen zusammenhalten

Text teilen

Einzelnes Dokument in Array von Chunks aufteilen.

local chunks, err = splitter:split_text(document)

for i, chunk in ipairs(chunks) do
    -- Jeden Chunk verarbeiten (z.B. Embedding erstellen, an LLM senden)
    process(chunk)
end
Parameter Typ Beschreibung
text string Zu teilender Text

Gibt zurück: string[], error

Batch teilen

Mehrere Dokumente teilen, während ihre Metadaten erhalten bleiben. Jedes Eingabedokument kann mehrere Ausgabe-Chunks produzieren. Alle Chunks erben die Metadaten ihres Quelldokuments.

-- Eingabe: Seiten aus einem PDF mit Seitennummern
local pages = {
    {content = "First page content...", metadata = {page = 1}},
    {content = "Second page content...", metadata = {page = 2}}
}

local chunks, err = splitter:split_batch(pages)

-- Ausgabe: Jeder Chunk weiß, von welcher Seite er stammt
for _, chunk in ipairs(chunks) do
    print("Page " .. chunk.metadata.page .. ": " .. chunk.content:sub(1, 50))
end
Parameter Typ Beschreibung
pages table Array von {content, metadata}

Gibt zurück: table, error (Array von {content, metadata})

Fehler

Bedingung Art Wiederholbar
Ungültige Muster-Syntax errors.INVALID nein
Interner Fehler errors.INTERNAL nein

Siehe Fehlerbehandlung für die Arbeit mit Fehlern.