Tutorials › Teil 2: Daten

Kapitel 9 von 16

Text verarbeiten

Text ist in JavaScript unveränderlich. Keine einzige Methode ändert die Zeichenkette, auf der sie aufgerufen wird. Sie liefern alle eine neue zurück.

const wort = "Morsecode";

wort.toUpperCase();
zeige("unverändert:", wort);
zeige("das Ergebnis:", wort.toUpperCase());

Wer das vergisst, sucht lange. Der Rückgabewert muss irgendwo hin, sonst verpufft er.

Ausschneiden

const s = "Kostenlose-Javascripts";

zeige(s.length);
zeige(s[0], s.at(-1));
zeige(s.slice(0, 10));
zeige(s.slice(11));
zeige(s.slice(-11));

slice nimmt Anfang und Ende, wobei das Ende nicht mehr dazugehört. Bei slice(0, 10) kommen die Zeichen 0 bis 9 heraus, also zehn Stück. Negative Werte zählen von hinten.

Es gibt auch substring und das veraltete substr. Beide haben Eigenheiten, die niemand braucht. Nimm slice.

Suchen

const satz = "Der Browser rechnet, nicht der Server.";

zeige(satz.includes("Server"));
zeige(satz.indexOf("Browser"));
zeige(satz.startsWith("Der"));
zeige(satz.endsWith("."));
zeige("Groß und klein:", satz.toLowerCase().includes("server"));

Alle diese Methoden unterscheiden Groß- und Kleinschreibung. Wenn dir das egal sein soll, wandle vorher beide Seiten in Kleinbuchstaben um, so wie in der letzten Zeile.

Zerlegen und zusammensetzen

const zeile = "Telekom;9.95;DSL;24";
const teile = zeile.split(";");

zeige(teile);
zeige("Anbieter:", teile[0]);
zeige("wieder zusammen:", teile.join(" | "));

split macht aus Text ein Array, join macht aus einem Array Text. Die beiden sind ein Paar und tauchen ständig zusammen auf.

Mit leerem Trennzeichen zerfällt der Text in einzelne Zeichen:

zeige("Anna".split(""));
zeige("Anna".split("").reverse().join(""));

Die zweite Zeile ist der übliche Einzeiler zum Umdrehen. Das Werkzeug Namen rückwärts gelesen im Archiv macht genau das, nur umständlicher.

const mitEmoji = "Hallo 👋";

zeige("split:", mitEmoji.split("").length);
zeige("spread:", [...mitEmoji].length);

Ersetzen

const s = "eins zwei eins zwei";

zeige(s.replace("eins", "ONE"));
zeige(s.replaceAll("eins", "ONE"));

replace tauscht nur das erste Vorkommen. Das überrascht regelmäßig. replaceAll tauscht alle und ist seit 2021 überall verfügbar.

Putzen und auffüllen

const eingabe = "   kontakt@example.de  ";

zeige("[" + eingabe + "]");
zeige("[" + eingabe.trim() + "]");

trim entfernt Leerzeichen und Zeilenumbrüche an beiden Enden. Bei jedem Formularfeld, in das ein Mensch tippt, gehört das dazu. Leute fügen Text aus der Zwischenablage ein, und da hängt oft ein Leerzeichen dran.

for (const n of [3, 42, 500]) {
  zeige(String(n).padStart(5, "0"));
}

zeige("Kapitel".padEnd(12, ".") + "Seite 9");

padStart und padEnd füllen auf eine Mindestlänge auf. Für Uhrzeiten, Nummerierungen und alles, was in einer Spalte untereinanderstehen soll.

Mehrzeiliger Text

Backticks aus Kapitel 3 können mehr als nur Werte einsetzen:

const name = "Flensburg";
const quote = 99;

const text = `Ort: ${name}
Glasfaser: ${quote} %
Stand: heute`;

zeige(text);

Der Zeilenumbruch im Quelltext landet direkt im Ergebnis. Kein \n nötig.

Reguläre Ausdrücke, vorsichtig

Irgendwann reicht includes nicht mehr, weil du nicht nach einem festen Text suchst, sondern nach einem Muster. Dafür gibt es eine eigene Mini-Sprache.

const text = "Ruf an unter 0221 4567890 oder 030 111222.";

const nummern = text.match(/\d{3,4} \d{6,}/g);
zeige(nummern);

Zwischen den Schrägstrichen steht das Muster. \d bedeutet Ziffer, {3,4} bedeutet drei bis vier davon, das g am Ende sucht alle Treffer statt nur den ersten.

Ein paar Bausteine, mit denen man weit kommt:

zeige(/^\d+$/.test("12345"));
zeige(/^\d+$/.test("12a45"));
zeige("Bindestriche weg:", "030-11-22".replace(/-/g, ""));
zeige("mehrfache Leerzeichen:", "viel    Luft".replace(/\s+/g, " "));

^ heißt Anfang, $ heißt Ende, + heißt einmal oder öfter, \s heißt Leerraum. test gibt wahr oder falsch zurück.

Reguläre Ausdrücke sind mächtig und werden schnell unlesbar. Zwei Ratschläge dazu. Erstens: Wenn eine normale Methode reicht, nimm die normale Methode. Zweitens: Schreib einen Kommentar daneben, was das Muster bedeuten soll. Du selbst wirst es in drei Monaten nicht mehr entziffern.

Ein Beispiel aus dem Archiv

Morsecode ist eine Zuordnung von Zeichen zu Punkten und Strichen. Mit einem Objekt aus Kapitel 8 und den Methoden von hier ist das eine überschaubare Sache.

const code = {
  a: ".-", b: "-...", c: "-.-.", d: "-..", e: ".", f: "..-.",
  g: "--.", h: "....", i: "..", j: ".---", k: "-.-", l: ".-..",
  m: "--", n: "-.", o: "---", p: ".--.", q: "--.-", r: ".-.",
  s: "...", t: "-", u: "..-", v: "...-", w: ".--", x: "-..-",
  y: "-.--", z: "--..",
};

function zuMorse(text) {
  return text
    .toLowerCase()
    .split(" ")
    .map((wort) => [...wort].map((z) => code[z] ?? "").filter(Boolean).join(" "))
    .join("  /  ");
}

zeige(zuMorse("SOS"));
zeige(zuMorse("Hallo Welt"));

Sechs Zeilen für die Umwandlung. Das Morsecode-Werkzeug im Archiv braucht dafür rund fünfzig, weil es mit zwei parallelen Arrays und einer verschachtelten Schleife arbeitet statt mit einem Objekt.

Das ?? "" fängt Zeichen ab, für die es keinen Code gibt, etwa Satzzeichen. filter(Boolean) wirft die dabei entstandenen leeren Einträge wieder raus.

Zahlen sind das nächste Thema.