Przejdź do głównej treści
eLearner.app
Moduł 2 · Lekcja 4 z 48/32 w kursie~12 min
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).

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".

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

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

Nic 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

Ćwiczenie#regex.m2.l4.e1
Próby: 0Ładowanie...

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

Ładowanie edytora...
Pokaż wskazówkę

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

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

Ćwiczenie#regex.m2.l4.e2
Próby: 0Ładowanie...

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

Ładowanie edytora...
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

Ćwiczenie#regex.m2.l4.e3
Próby: 0Ładowanie...

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

Ładowanie edytora...
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