Pelajaran modul (3/4)
Serakah vs malas
Secara default, quantifier bersifat serakah: mereka mengkonsumsi sebanyak mungkin
sambil menjaga polanya tetap valid. Menambahkan ? setelah pembilang (*?, +?,
??, {n,m}?) memberi Anda versi malas: mengkonsumsi sesedikit
mungkin.
Sample: **uno** e *due*
Greedy pattern <.*> matches: **uno** e *due* (everything)
Lazy pattern <.*?> matches: ** **
* * (4 matches with the g flag)Pola yang sama persis, satu karakter perbedaan (? ditambahkan ke
quantifier), hasil yang sangat berbeda.
Ketika itu penting
- Untuk mengekstrak konten di antara pembatas (tag HTML, tanda kutip, tanda kurung) versi malas hampir selalu yang benar.
- Untuk mencocokkan sampai akhir baris biasanya Anda ingin serakah (
.*).
Strategi Serakah vs Malas di mesin
Pengukur serakah menggunakan teks sebanyak mungkin dan melakukan backtrack hanya jika dipaksa. Dengan menambahkan ? (lazy), mesin menggunakan jumlah minimum absolut dan memajukan satu karakter pada satu waktu untuk mencari kecocokan pola berikutnya.
Cobalah
Ekstrak setiap tag HTML dari sampel (misalnya `**`, `**`, `*`, `*`) menggunakan versi lambat `.*?`.
Tunjukkan petunjuk
Greedy <.*> cocok dari awal tag pertama hingga akhir tag terakhir. Malas <.*?> berhenti di > pertama yang ditemuinya.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Ekstrak setiap string di antara tanda kutip ganda dalam teks (misalnya "ciao", "mondo"). Gunakan pembilang versi malas untuk menghindari lompatan ke penutupan berikutnya.
Tunjukkan petunjuk
".*?" berhenti pada kutipan ganda penutupan pertama.
Solusi tersedia setelah 3 upaya
Tantangan tambahan
Extract all text blocks enclosed in square brackets (e.g. `[text]`), including the brackets, using a lazy quantifier so as not to merge separate blocks.
Tunjukkan petunjuk
Gunakan \\[ untuk braket terbuka, lalu .*? dan terakhir \\] untuk braket tertutup.
Solusi tersedia setelah 3 upaya