Lektionen des Moduls (1/4)
Positives Lookahead: `(?=...)`
Ein positives Lookahead (?=...) ist eine Zusicherung mit der Breite Null (zero-width):
Es prüft, ob ein bestimmtes Muster auf die aktuelle Position folgt, konsumiert aber keine Zeichen.
Pattern: \d+(?= euro)
Sample: Prezzo 100 euro, sconto 25 euro, totale 75 dollari.
^^^ ^^Das Lookahead (?= euro) erfordert, dass auf die Ziffern euro folgt, aber der Treffer enthält nur die Ziffern. 75 dollari matcht nicht (kein euro).
Warum "Breite Null"
Stelle dir das Lookahead als eine Bedingung für die Position vor, nicht als Teil des Treffers:
- Der Treffer stoppt vor dem Lookahead.
- Die Position "nach dem Treffer" ist der Anfang des Textes, der vom Lookahead überprüft wird.
- Der nächste Matching-Versuch mit dem Flag
gwird dort fortgesetzt.
Dies macht es perfekt, um Werte ohne ihren Kontext zu extrahieren: Preise ohne Währung, Wörter vor einem Satzzeichen und so weiter.
Lookahead-Funktionen und Scan mit Breite Null
Das positive Lookahead (?=...) garantiert, dass das angegebene Muster auf den aktuellen Punkt folgt, aber der Scan wird an der Position vor dem Lookahead fortgesetzt. Dies verhindert das "Konsumieren" von Textteilen, die für nachfolgende Treffer benötigt werden könnten.
Probiere es aus
Extrahiere NUR die Ziffern der Euro-Preise (die Ziffernfolgen, auf die ' euro' folgt). Keine Währung im Treffer.
Hinweis anzeigen
Verschiebe ' euro' in ein Lookahead (?= euro): Der String wird nicht Teil des Treffers sein.
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
Finde jedes Wort, auf das unmittelbar ein Doppelpunkt `:` folgt (jedoch ohne den Doppelpunkt in den Treffer aufzunehmen).
Hinweis anzeigen
Gleiche Logik: Der Doppelpunkt `:` ist nicht im Treffer, sondern eine Positionsbedingung.
Lösung nach 3 Versuchen verfügbar
Zusätzliche Herausforderung
Finde jedes Wort (z. B. Funktionsname), auf das unmittelbar eine öffnende Klammer `(` folgt, und schließe die Klammer aus dem Treffer aus.
Hinweis anzeigen
Verschiebe \( (maskierte öffnende Klammer) in das positive Lookahead (?=...).
Lösung nach 3 Versuchen verfügbar