Passer au contenu principal
eLearner.app
Module 2 · Leçon 4 sur 48/32 dans le cours~12 min
Leçons du module (4/4)

Backtracking : notions

Lorsqu'un quantificateur gourmand « en fait trop », le moteur fait marche arrière : revenez en arrière, essayez une autre configuration, réessayez. Allez les motifs simples sont invisibles ; sur des patrons mal écrits cela peut devenir exponentiel et bloquez le navigateur pendant quelques secondes. C'est la racine de ReDoS (expression régulière déni de service).

Code
Pattern: .*\d
Sample:  abc123def
Steps:
  1.  .*  consuma tutto: "abc123def"
  2.  \d  fallisce (fine stringa).
  3.  Backtrack: .* lascia 'f' -> "abc123de", \d fallisce su 'f'.
  4.  Backtrack: .* lascia 'ef' -> "abc123d", \d fallisce su 'e'.
  5.  ... e cosi' via finche' \d trova una cifra: match = "abc123" + "?"... in realta'
       il pattern matcha "abc123" perche' .* lascia "def" e \d cerca su '3'? No: il backtrack
       continua e .* finisce per essere "abc12", \d=3.  Match finale: "abc123".

Le moteur y arrive toujours, mais si le quantificateur gourmand l'a dedans un autre quantificateur glouton (par exemple (a+)+), le nombre de les configurations à essayer peuvent exploser.

Modèles catastrophiques

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

Rien de final b → le motif échoue, mais le moteur essaie d'y arriver toutes les partitions possibles de a. Croissance exponentielle : avec 30 a vous pouvez attendre des heures.

Dangers du retour en arrière et du ReDoS

Lorsqu'un modèle comprend des quantificateurs superposés ou imbriqués (par exemple (a+)+), le moteur évalue un nombre exponentiel de combinaisons avant d'échouer. Le remplacement des caractères génériques par l'exclusion de classes de caractères réduit considérablement les chemins de retour en arrière.

Essayez-le vous-même

Exercice#regex.m2.l4.e1
Tentatives : 0Chargement…

Estrai il contenuto fra parentesi quadre per ogni occorrenza nel testo. Usa la versione lazy del quantificatore per non saltare a chiusure successive.

Chargement de l'éditeur…
Afficher l'indice

\\[.*?\\] si ferma al primo ] di chiusura: niente backtracking pesante.

Solution disponible après 3 tentatives

Exercice de révision

Exercice#regex.m2.l4.e2
Tentatives : 0Chargement…

Trova ogni URL `http://...` o `https://...` nel testo, usando il quantificatore `?` per la `s` opzionale e `\\S+` per i caratteri non-spazio del path.

Chargement de l'éditeur…
Afficher l'indice

https? significa 'http' seguito da 's' opzionale. Poi //, poi \\S+ (non-spazi).

Solution disponible après 3 tentatives

Défi supplémentaire

Exercice#regex.m2.l4.e3
Tentatives : 0Chargement…

Matcha le stringhe racchiuse tra virgolette doppie evitando backtracking eccessivo usando la classe negata `[^"]*` invece di `.*`.

Chargement de l'éditeur…
Afficher l'indice

Sostituisci il punto con la classe negata [^"] per limitare i possibili tentativi dell'engine.

Solution disponible après 3 tentatives