Direct naar de hoofdinhoud
Module 6 · Les 1 van 421/32 in de cursus~10 min
Modulelessen (1/4)

Positieve vooruitblik: `(?=...)`

Een positieve vooruitblik (?=...) is een bewering van nulbreedte: het controleert of een bepaald patroon de huidige positie volgt, maar doet dat wel consumeer deze karakters niet.

Code
Pattern: \d+(?= euro)
Sample:  Prezzo 100 euro, sconto 25 euro, totale 75 dollari.
                ^^^                 ^^

De lookahead (?= euro) vereist dat de cijfers worden gevolgd door euro, maar de wedstrijd bevat alleen de cijfers. 75 dollari komt niet overeen (geen euro).

Waarom "nulbreedte"

Beschouw de vooruitblik als een voorwaarde voor de positie, niet als een voorwaarde onderdeel van de wedstrijd:

  • De wedstrijd stopt vóór de vooruitblik.
  • De positie "na de wedstrijd" is het begin van de tekst die door de lookahead wordt geïnspecteerd.
  • De volgende wedstrijdpoging met de vlag g wordt vanaf daar hervat.

Dit maakt het perfect voor het extraheren van waarden zonder hun context: prijzen zonder de valuta, woorden vóór een leesteken, enzovoort.

Lookahead-functies en nulbreedtescan

De positieve vooruitkijk (?=...) garandeert dat het opgegeven patroon het huidige punt volgt, maar het scannen wordt hervat vanaf de positie vóór de vooruitkijk. Dit voorkomt dat delen van de tekst worden "gebruikt" die nodig kunnen zijn voor volgende overeenkomsten.

Probeer het

Oefening#regex.m6.l1.e1
Pogingen: 0Laden…

Extraheer ALLEEN de cijfers van de europrijzen (de reeks cijfers gevolgd door 'euro'). Geen valuta in de wedstrijd.

Editor laden…
Toon hint

Verplaats 'euro' binnen een lookahead (?= euro): de string maakt geen deel uit van de match.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#regex.m6.l1.e2
Pogingen: 0Laden…

Vind elk woord onmiddellijk gevolgd door een dubbele punt `:` (maar zonder de dubbele punt in de overeenkomst op te nemen).

Editor laden…
Toon hint

Dezelfde logica: de `:` zit niet in de match, maar het is een positievoorwaarde.

Oplossing beschikbaar na 3 pogingen

Extra uitdaging

Oefening#regex.m6.l1.e3
Pogingen: 0Laden…

Find every word (e.g. function name) followed immediately by an open parenthesis `(`, excluding the parenthesis from the match.

Editor laden…
Toon hint

Verplaats \\( (ontsnapte open haakjes) binnen de positieve lookahead (?=...).

Oplossing beschikbaar na 3 pogingen