Lekcje modułu (4/4)
Backtracking: podstawy
Kiedy zachłanny kwantyfikator „przesadzi”, silnik cofa się: cofnij się o krok, spróbuj innej konfiguracji, spróbuj ponownie. Chodź proste wzory są niewidoczne; na źle napisanych wzorach może się stać wykładniczy i zablokuj przeglądarkę na kilka sekund. To jest korzeń ReDoS (Wyrażenie regularne Odmowa usługi).
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".Silnik zawsze tam dotrze, ale jeśli ma go zachłanny kwantyfikator
inny zachłanny kwantyfikator (np. (a+)+), liczba
konfiguracje do wypróbowania mogą eksplodować.
Katastrofalne wzorce
Pattern: (a+)+b
Sample: aaaaaaaaaaaaaaaaaaaaaNic ostatecznego b → wzorzec nie działa, ale silnik próbuje się tam dostać
wszystkie możliwe partycje a. wykładniczy wzrost: z 30
a możesz czekać godzinami.
Niebezpieczeństwa związane z wycofywaniem się i ReDoS
Gdy wzorzec zawiera nakładające się lub zagnieżdżone kwantyfikatory (np. (a+)+), silnik ocenia wykładniczą liczbę kombinacji, zanim zakończy się niepowodzeniem. Zastąpienie ogólnych symboli wieloznacznych wykluczającymi klasami znaków radykalnie zmniejsza liczbę ścieżek wycofywania się.
Spróbuj sam
Estrai il contenuto fra parentesi quadre per ogni occorrenza nel testo. Usa la versione lazy del quantificatore per non saltare a chiusure successive.
Pokaż wskazówkę
\\[.*?\\] si ferma al primo ] di chiusura: niente backtracking pesante.
Rozwiązanie dostępne po 3 próbach
Przejrzyj ćwiczenie
Trova ogni URL `http://...` o `https://...` nel testo, usando il quantificatore `?` per la `s` opzionale e `\\S+` per i caratteri non-spazio del path.
Pokaż wskazówkę
https? significa 'http' seguito da 's' opzionale. Poi //, poi \\S+ (non-spazi).
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
Matcha le stringhe racchiuse tra virgolette doppie evitando backtracking eccessivo usando la classe negata `[^"]*` invece di `.*`.
Pokaż wskazówkę
Sostituisci il punto con la classe negata [^"] per limitare i possibili tentativi dell'engine.
Rozwiązanie dostępne po 3 próbach