Direct naar de hoofdinhoud
Module 2 · Les 4 van 48/32 in de cursus~12 min
Modulelessen (4/4)

Backtracking: een overzicht

Wanneer een hebzuchtige kwantor "doorschiet", voert de engine backtracking uit: het doet een stap terug, probeert een andere configuratie, probeert het opnieuw. Op eenvoudige patronen is onzichtbaar; op slecht geschreven patronen kan het exponentieel worden en bevries de browser gedurende seconden. Het is de root van ReDoS (Regular uitdrukking Denial of Service).

Code
Pattern: .*\d
Sample:  abc123def
Steps:
  1.  .*  consumes everything: "abc123def"
  2.  \d  fails (end of string).
  3.  Backtrack: .* drops 'f' -> "abc123de", \d fails on 'f'.
  4.  Backtrack: .* drops 'ef' -> "abc123d", \d fails on 'e'.
  5.  ... and so on until \d finds a digit: match = "abc123" + "?"... actually
       the pattern matches "abc123" because .* leaves "def" and \d looks at '3'? No: the
       backtrack continues and .* ends up being "abc12", \d=3.  Final match: "abc123".

De motor komt er altijd wel, maar als er een hebzuchtige kwantificator in zit nog een hebzuchtige kwantificator (bijv. (a+)+), het aantal configuraties proberen kan ontploffen.

Catastrofale patronen

Code
Pattern: (a+)+b
Sample:  aaaaaaaaaaaaaaaaaaaaa

Geen trailing b → het patroon mislukt, maar om daar te komen probeert de engine alles mogelijke partitie van de as. Exponentiele groei: met 30 as is dat mogelijk uren wachten.

Gevaren van backtracking en ReDoS

Wanneer een patroon overlappende of geneste kwantoren bevat (bijvoorbeeld (a+)+), evalueert de engine een exponentieel aantal paden voordat deze faalt. Het vervangen van generieke jokertekens door het uitsluiten van tekenklassen vermindert de backtracking-paden dramatisch.

Probeer het

Oefening#regex.m2.l4.e1
Pogingen: 0Laden…

Extraheer de inhoud tussen vierkante haken voor elk exemplaar in de tekst. Gebruik de luie versie van de kwantor om te voorkomen dat u naar latere sluitingen springt.

Editor laden…
Toon hint

\\[.*?\\] stopt bij de eerste sluiting ]: geen zware backtracking.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#regex.m2.l4.e2
Pogingen: 0Laden…

Zoek elke `http://...` of `https://...` URL in de tekst, met behulp van de `?`-kwantificator voor de optionele `s` en `\\S+` voor de niet-spaties van het pad.

Editor laden…
Toon hint

https? betekent 'http' gevolgd door een optionele 's'. Dan //, dan \\S+ (niet-spaties).

Oplossing beschikbaar na 3 pogingen

Extra uitdaging

Oefening#regex.m2.l4.e3
Pogingen: 0Laden…

Match strings enclosed in double quotes, avoiding excessive backtracking by using the negated class `[^"]*` instead of `.*`.

Editor laden…
Toon hint

Replace the dot with the negated class [^"] to restrict the engine's backtracking paths.

Oplossing beschikbaar na 3 pogingen