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).
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
Pattern: (a+)+b
Sample: aaaaaaaaaaaaaaaaaaaaaRien 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
Estrai il contenuto fra parentesi quadre per ogni occorrenza nel testo. Usa la versione lazy del quantificatore per non saltare a chiusure successive.
Afficher l'indice
\\[.*?\\] si ferma al primo ] di chiusura: niente backtracking pesante.
Solution disponible après 3 tentatives
Exercice de révision
Trova ogni URL `http://...` o `https://...` nel testo, usando il quantificatore `?` per la `s` opzionale e `\\S+` per i caratteri non-spazio del path.
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
Matcha le stringhe racchiuse tra virgolette doppie evitando backtracking eccessivo usando la classe negata `[^"]*` invece di `.*`.
Afficher l'indice
Sostituisci il punto con la classe negata [^"] per limitare i possibili tentativi dell'engine.
Solution disponible après 3 tentatives