Reguläre Ausdrücke mit NFA-basiertem Bytecode-Interpreter. Unterstützt Match (ganzer String), Search (erstes Vorkommen), Replace, Alternation (foo|bar) und Capture-Gruppen (bis zu 32, CaptureText). Flags: IGNORE_CASE (Groß-/Kleinschreibung ignorieren), ANCHORED (nur am Anfang), MULTILINE ('^'/$ matchen Zeilengrenzen). Sowohl einfache API (RegexMatch, RegexSearch, RegexReplace) als auch kompilierte Varianten für Wiederverwendung. RegexSearchSpan liefert Start- und End-Position eines Treffers; RegexFindAll findet alle nicht-überlappenden Treffer auf einmal.
Einsatzbereiche: Eingabevalidierung (E-Mail, Telefon, URLs), Log-Parsing, Template-Ersetzung, Protokoll-Analyse, SEO-Content-Analyse.
Autor: Andreas Röne
Copyright: 2024-2025 Andreas Röne
std.alloc| Signatur | Sichtbarkeit | Beschreibung |
|---|---|---|
isAlpha(c: int64): int64 | pub | Prüft ob Zeichen ein Buchstabe ist |
isDigit(c: int64): int64 | pub | Prüft ob Zeichen eine Ziffer ist |
isAlnum(c: int64): int64 | pub | Prüft ob Zeichen alphanumerisch ist |
isWhitespace(c: int64): int64 | pub | Prüft ob Zeichen ein Leerzeichen ist |
isWordChar(c: int64): int64 | pub | Prüft ob Zeichen ein Wortzeichen ist |
atomLen(pattern: pchar, start: int64): int64 | pub | Berechnet Länge eines Regex-Atoms |
atomMatches(pattern: pchar, start: int64, c: int64): int64 | pub | Prüft ob Zeichen auf Regex-Atom passt |
matchHere(pattern: pchar, pIdx: int64, text: pchar, tIdx: int64): int64 | pub | Interner rekursiver Regex-Matcher |
regexSearchFrom(pattern: pchar, text: pchar, startIdx: int64): int64 | pub | Sucht Muster ab gegebenem Startindex |
_RegexMatch(pattern: pchar, text: pchar): bool | pub | Interne Match-Implementierung |
_RegexSearch(pattern: pchar, text: pchar): int64 | pub | Interne Search-Implementierung |
_RegexReplace(pattern: pchar, text: pchar, replacement: pchar): int64 | pub | Interne Replace-Implementierung |
Match(pattern: pchar, text: pchar): bool | pub | Prüft ob gesamter Text zum Muster passt |
Search(pattern: pchar, text: pchar): int64 | pub | Sucht erstes Vorkommen des Musters |
Replace(pattern: pchar, text: pchar, replacement: pchar): int64 | pub | Ersetzt erstes Vorkommen durch Ersatztext |
| Name | Typ | Wert | Sichtbarkeit |
|---|---|---|---|
REGEX_FLAG_IGNORE_CASE | int64 | 1 | pub |
REGEX_FLAG_ANCHORED | int64 | 2 | pub |
REGEX_FLAG_MULTILINE | int64 | 4 | pub |
REGEX_MAX_CAPTURE_SLOTS | int64 | 32 | pub |
REGEX_STACK_MAX | int64 | 256 | pub |
| Feld | Typ |
|---|---|
instrStart | int64 |
classCount | int64 |
captureSlots | int64 |
| Feld | Typ |
|---|---|
pc | int64 |
pos | int64 |
caps | array[32]int64 |
| Signatur | Sichtbarkeit | Beschreibung |
|---|---|---|
RegexSearchCompiledEx(prog: pchar, progLen: int64, text: pchar, | pub | Sucht in Text mit Flags und Capture-Gruppen |
RegexMatchCompiledEx(prog: pchar, progLen: int64, text: pchar, | pub | Matcht gesamten Text mit Flags und Captures |
RegexSearchCompiled(prog: pchar, progLen: int64, text: pchar): int64 | pub | Sucht erstes Vorkommen mit kompiliertem Programm |
RegexMatchCompiled(prog: pchar, progLen: int64, text: pchar): bool | pub | Matcht gesamten Text mit kompiliertem Programm |
RegexReplaceCompiledEx(prog: pchar, progLen: int64, text: pchar, | pub | Ersetzt Treffer mit Flags und kompiliertem Programm |
RegexReplaceCompiled(prog: pchar, progLen: int64, text: pchar, | pub | Ersetzt Treffer mit kompiliertem Programm |
RegexMatchEx(pattern: pchar, text: pchar, flags: int64): bool | pub | Matcht Text mit Muster und Flags |
RegexSearchEx(pattern: pchar, text: pchar, flags: int64): int64 | pub | Sucht Muster in Text mit Flags |
RegexReplaceEx(pattern: pchar, text: pchar, replacement: pchar, | pub | Ersetzt Treffer mit Flags |
RegexReplaceInto(dest: pchar, pattern: pchar, text: pchar, | pub | Schreibt Ergebnis in vorhandenen Puffer |
RegexCaptureCount(): int64 | pub | Gibt Anzahl der letzten Capture-Gruppen zurück |
RegexCaptureStart(group: int64): int64 | pub | Gibt Startposition einer Capture-Gruppe zurück |
RegexCaptureEnd(group: int64): int64 | pub | Gibt Endposition einer Capture-Gruppe zurück |
RegexCaptureText(dest: pchar, text: pchar, group: int64): pchar | pub | Kopiert Capture-Gruppen-Text in Puffer |
MatchEx(pattern: pchar, text: pchar, flags: int64): bool | pub | Kurzform von RegexMatchEx |
SearchEx(pattern: pchar, text: pchar, flags: int64): int64 | pub | Kurzform von RegexSearchEx |
ReplaceEx(pattern: pchar, text: pchar, replacement: pchar, | pub | Kurzform von RegexReplaceEx |
ReplaceInto(dest: pchar, pattern: pchar, text: pchar, | pub | Kurzform von RegexReplaceInto |
CaptureCount(): int64 | pub | Kurzform von RegexCaptureCount |
CaptureStart(group: int64): int64 | pub | Kurzform von RegexCaptureStart |
CaptureEnd(group: int64): int64 | pub | Kurzform von RegexCaptureEnd |
CaptureText(dest: pchar, text: pchar, group: int64): pchar | pub | Kurzform von RegexCaptureText |
RegexMatch(pattern: pchar, text: pchar): bool | pub | Kanonischer Alias für Match |
RegexSearch(pattern: pchar, text: pchar): int64 | pub | Kanonischer Alias für Search |
RegexReplace(pattern: pchar, text: pchar, replacement: pchar): int64 | pub | Kanonischer Alias für Replace |
RegexSearchSpan(pattern: pchar, text: pchar, startOut: int64, endOut: int64): bool | pub | Sucht Muster und schreibt Match-Start und -End per poke64 in zwei int64-Adressen; gibt false zurück wenn kein Treffer |
RegexFindAll(pattern: pchar, text: pchar, out: int64, maxMatches: int64): int64 | pub | Findet alle nicht-überlappenden Treffer; out ist Adresse eines Puffers der pchar-Zeiger aufnimmt (8 Bytes je Treffer, heap-alloc'd); gibt Trefferanzahl zurück |
var startBuf: int64 := alloc(8) as int64;
var endBuf: int64 := alloc(8) as int64;
if (RegexSearchSpan("foo|bar", text, startBuf, endBuf)) {
var s: int64 := peek64(startBuf);
var e: int64 := peek64(endBuf);
// Treffer liegt in text[s..e)
}
free(startBuf, 8);
free(endBuf, 8);
var buf: int64 := alloc(16 * 8) as int64; // max. 16 Treffer
var n: int64 := RegexFindAll("\d+", text, buf, 16);
var i: int64 := 0;
while (i < n) {
var s: pchar := peek64(buf + i * 8) as pchar;
// s ist jeder Treffer als heap-alloc'd pchar — Aufrufer muss free aufrufen
i := i + 1;
}
free(buf, 16 * 8);
// | matcht auf oberster Ebene; Gruppen schränken den Geltungsbereich ein
var pos: int64 := RegexSearch("error|warn|info", logLine);
var pos2: int64 := RegexSearch("(GET|POST) /api", httpLine);
| wird von RegexSearch, RegexMatch, RegexSearchSpan und RegexFindAll unterstützt. Die kompilierte API (RegexSearchCompiledEx etc.) kennt kein | im Bytecode-Format.RegexFindAll: Aufrufer gibt Treffer frei — jeder zurückgegebene pchar-Zeiger ist heap-alloc'd. Für n Treffer der Länge L gilt: free(ptr, L + 1) pro Treffer.RegexSearchSpan: Adressen, keine Werte — startOut und endOut sind int64-Adressen (z. B. alloc(8) as int64), nicht direkte Ausgabevariablen.match — in internem Code verwendet die Unit matched2 statt matched und pEnd statt to, da beide reservierte Keywords sind (TK_MATCH = 27). Betrifft nur eigenen Code der Unit, nicht die öffentliche API.