Kiste
EN

Standard-Bibliothek — `text`

Verfügbar — implementiert in Phase B.6.3. Vollständige Spec in docs/text.md.

Texte verarbeiten: prüfen, umformen, aufteilen, verketten. Eines der wichtigsten Module — fast jedes Programm liest oder schreibt irgendwann Text.

19.1 Strings sind in Kiste immutabel

Das ist der wichtigste konzeptuelle Punkt für text:

Ein text-Wert kann nicht verändert werden. Wenn du einen Text „groß schreiben" willst, bekommst du einen neuen Text zurück; der alte bleibt was er war.

Deshalb hat das text-Modul keine Imperativ-Funktionen — anders als liste. Es gibt text.großgeschrieben, aber kein text.großschreibe. Es gibt text.beschnitten, aber kein text.beschneide.

nutze text

nimm s = "hallo"
nimm groß = text.großgeschrieben(s)
sag s         // "hallo"   ← unverändert
sag groß      // "HALLO"

19.2 Aktivieren und Prüfen

nutze text

nimm name = "Sascha"
sag text.länge(name)              // 6
sag text.leer(name)               // falsch
sag text.enthält(name, "scha")    // wahr
sag text.beginnt_mit(name, "S")   // wahr
sag text.endet_mit(name, "ha")    // wahr
sag text.finde_index(name, "ch")  // 3
sag text.zähle("aaaa", "aa")      // 2 (nicht-überlappend!)

19.3 Transformation

sag text.großgeschrieben("hallo")          // "HALLO"
sag text.kleingeschrieben("HALLO")         // "hallo"
sag text.kapitalisiert("hallo welt")       // "Hallo welt"  (nur erstes Zeichen)
sag text.beschnitten("  hallo  ")          // "hallo"
sag text.beschnitten("**hi**", "*")        // "hi"
sag text.ersetzt("aaa", "a", "bb")         // "bbbbbb"   (alle)
sag text.ersetzt_erstes("aaa", "a", "X")   // "Xaa"      (nur erstes)
sag text.umgekehrt("hallo")                // "ollah"
sag text.wiederholt("ab", 3)               // "ababab"
sag text.gefüllt_links("42", 5, "0")       // "00042"
sag text.gefüllt_rechts("42", 5, " ")      // "42   "

19.4 Grapheme-Bewusstsein

text.länge, text.umgekehrt, text.scheibe, text.zeichen_bei arbeiten alle auf Grapheme (sichtbare Zeichen), nicht auf Bytes oder Unicode-Codepoints. Das ist die Default-Linie aus B.3.7.

sag text.länge("café")             // 4   ← der Mensch sieht 4 Zeichen
sag text.umgekehrt("café")         // "éfac"  ← niemals halbiertes é
sag text.scheibe("café", 0, 2)     // "caf"

Das gleiche gilt für Emoji-Sequenzen (Familien, Flaggen):

sag text.länge("👨‍👩‍👧")              // 1   ← die ZWJ-Familie ist EIN Zeichen
sag text.umgekehrt("a👨‍👩‍👧b")       // "b👨‍👩‍👧a"

19.5 Auswahl

nimm s = "Hallo Welt"
sag text.scheibe(s, 0, 4)        // "Hallo"
sag text.scheibe(s, -3, -1)      // "elt"   (negative Indizes)
sag text.zeichen_bei(s, 6)       // "W"
sag text.erste_n(s, 5)           // "Hallo"
sag text.letzte_n(s, 4)          // "Welt"

Stolperfalle beim Modul-Wechsel: text.scheibe(t, 0, 4) schneidet bis einschließlich Index 4 (5 Zeichen) — bytes.scheibe(b, 0, 4) dagegen bis vor Index 4 (4 Bytes, Python-Stil). Wer zwischen Text und Bytes wechselt, baut hier leicht einen Versatz um eins ein (Bug 007 in BUGS-GEFUNDEN.md — eine einheitliche Konvention ist in Diskussion).

19.6 In Liste aufteilen

sag text.zerlegt("a,b,c", ",")   // ["a", "b", "c"]
sag text.zerlegt("a,,b", ",")    // ["a", "", "b"]   ← leere Einträge bleiben

nimm doc = """Erste Zeile
Zweite Zeile
Dritte"""
sag text.zeilen(doc)             // ["Erste Zeile", "Zweite Zeile", "Dritte"]

sag text.wörter("  Hallo   Welt  ")   // ["Hallo", "Welt"]   ← leere Einträge raus

sag text.zeichen("café")         // ["c", "a", "f", "é"]

text.wörter und text.zeilen werfen leere Einträge an Whitespace-Sequenzen UND am Anfang/Ende weg — was du als „Wörter zählen" oder „Zeilen lesen" intuitiv erwartest. text.zerlegt dagegen behält leere Einträge — das ist semantisch wichtig für CSV-artige Daten.

19.7 Aus Liste verketten

nimm namen = ["Anna", "Beat", "Cäcilia"]
sag text.verkettet(namen, ", ")        // "Anna, Beat, Cäcilia"
sag text.verkettet(namen, "")          // "AnnaBeatCäcilia"
sag text.verkettet(namen, " | ")       // "Anna | Beat | Cäcilia"

Naming-Hinweis: text.verkettet (nicht text.verbunden) — weil liste.verbunden(l1, l2) aus Kapitel 18 schon zwei Listen verbindet. Verschiedene Operationen brauchen verschiedene Namen.

19.8 Roundtrip-Idiom

nimm csv = "rot;grün;blau;gelb"
nimm farben = text.zerlegt(csv, ";")
// ... farben verarbeiten ...
nimm zurück = text.verkettet(farben, ";")
sag csv == zurück    // wahr

19.9 Was nicht in text ist

  • Reguläre Ausdrücke — kommt mit regex-Modul (Phase B.9).
  • Lokalisiertes Upper/Lower (z.B. türkisches İ/ı) — kommt mit lokal-Modul; heute Unicode-Standard sprachneutral.
  • Format-Strings (à la printf) — Kistes String-Interpolation "{x + y}" deckt das ab.
  • Encoding-Konvertierung (Latin-1, Shift-JIS) — alle text-Werte sind UTF-8; Konvertierung lebt später in bytes/encoding.