Lompati ke konten utama
Modul 2 · Pelajaran 3 dari 47/32 dalam kursus~10 min
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.

Code
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

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

Ekstrak setiap tag HTML dari sampel (misalnya `**`, `**`, `*`, `*`) menggunakan versi lambat `.*?`.

Memuat editor…
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

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

Ekstrak setiap string di antara tanda kutip ganda dalam teks (misalnya "ciao", "mondo"). Gunakan pembilang versi malas untuk menghindari lompatan ke penutupan berikutnya.

Memuat editor…
Tunjukkan petunjuk

".*?" berhenti pada kutipan ganda penutupan pertama.

Solusi tersedia setelah 3 upaya

Tantangan tambahan

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

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.

Memuat editor…
Tunjukkan petunjuk

Gunakan \\[ untuk braket terbuka, lalu .*? dan terakhir \\] untuk braket tertutup.

Solusi tersedia setelah 3 upaya