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).
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
Pattern: (a+)+b
Sample: aaaaaaaaaaaaaaaaaaaaaTidak 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
Ekstrak konten di antara tanda kurung siku untuk setiap kemunculan dalam teks. Gunakan pembilang versi malas untuk menghindari lompatan ke penutupan berikutnya.
Tunjukkan petunjuk
\\[.*?\\] berhenti pada penutupan pertama ]: tidak ada kemunduran yang berat.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Temukan setiap URL `http://...` atau `https://...` dalam teks, menggunakan `?` quantifier untuk `s` opsional dan `\\S+` untuk karakter non-spasi pada jalur.
Tunjukkan petunjuk
https? berarti 'http' diikuti dengan 's' opsional. Lalu //, lalu \\S+ (bukan spasi).
Solusi tersedia setelah 3 upaya
Tantangan tambahan
Match strings enclosed in double quotes, avoiding excessive backtracking by using the negated class `[^"]*` instead of `.*`.
Tunjukkan petunjuk
Replace the dot with the negated class [^"] to restrict the engine's backtracking paths.
Solusi tersedia setelah 3 upaya