Lompati ke konten utama
Modul 2 · Pelajaran 4 dari 48/32 dalam kursus~12 min
Pelajaran modul (4/4)

Mundur: gambaran umum

Saat pengukur serakah "melampaui", mesin akan melakukan pelacakan mundur: ia mundur, mencoba konfigurasi lain, mencoba lagi. Pada pola sederhana itu tidak terlihat; pada pola yang ditulis dengan buruk, ini bisa menjadi eksponensial dan membekukan browser selama beberapa detik. Ini adalah akar dari ReDoS (Reguler ekspresi Penolakan Layanan).

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

Mesinnya selalu sampai di sana, tetapi jika ada pengukur serakah penghitung serakah lainnya (misalnya (a+)+), jumlah konfigurasi untuk mencoba bisa meledak.

Pola bencana

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

Tidak ada tambahan b → polanya gagal, tetapi untuk mencapainya mesin mencoba setiap saat kemungkinan partisi as. Pertumbuhan Eksponensial: dengan 30 as Anda bisa menunggu berjam-jam.

Bahaya kemunduran dan ReDoS

Ketika suatu pola berisi bilangan yang tumpang tindih atau bersarang (misalnya (a+)+), mesin mengevaluasi sejumlah jalur secara eksponensial sebelum gagal. Mengganti wildcard generik dengan mengecualikan kelas karakter secara dramatis mengurangi jalur kemunduran.

Cobalah

Latihan#regex.m2.l4.e1
Upaya: 0Memuat…

Ekstrak konten di antara tanda kurung siku untuk setiap kemunculan dalam teks. Gunakan pembilang versi malas untuk menghindari lompatan ke penutupan berikutnya.

Memuat editor…
Tunjukkan petunjuk

\\[.*?\\] berhenti pada penutupan pertama ]: tidak ada kemunduran yang berat.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#regex.m2.l4.e2
Upaya: 0Memuat…

Temukan setiap URL `http://...` atau `https://...` dalam teks, menggunakan `?` quantifier untuk `s` opsional dan `\\S+` untuk karakter non-spasi pada jalur.

Memuat editor…
Tunjukkan petunjuk

https? berarti 'http' diikuti dengan 's' opsional. Lalu //, lalu \\S+ (bukan spasi).

Solusi tersedia setelah 3 upaya

Tantangan tambahan

Latihan#regex.m2.l4.e3
Upaya: 0Memuat…

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

Memuat editor…
Tunjukkan petunjuk

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

Solusi tersedia setelah 3 upaya