Ana içeriğe geç
Modül 2 · Ders 3 ders 4Kurstaki 7/32~10 min
Modül dersleri (3/4)

Açgözlü vs tembel

Varsayılan olarak nicelik belirteçleri açgözlüdür: mümkün olduğu kadar çok tüketirler modeli geçerli tutarken. Bir niceleyiciden sonra ? eklenmesi (*?, +?, ??, {n,m}?) size tembel versiyonunu verir: kadar az tüketir mümkün.

Code
Sample: **uno** e *due*

Greedy pattern  <.*>     matches:  **uno** e *due*   (everything)
Lazy pattern    <.*?>    matches:  **           **
                                   *           *        (4 matches with the g flag)

Tamamen aynı kalıp, tek karakterlik fark (? eklenmiş niceleyici), tamamen farklı sonuçlar.

Önemli olduğunda

  • sınırlayıcılar arasındaki içeriği çıkarmak için (HTML etiketleri, tırnak işaretleri, parantez) tembel versiyonu neredeyse her zaman doğru olanıdır.
  • satır sonuna kadar eşleşmek için genellikle açgözlü (.*) istersiniz.

Motordaki Açgözlü ve Tembel stratejileri

Açgözlü bir niceleyici, mümkün olduğu kadar çok metin tüketir ve yalnızca zorlandığında geriye doğru izler. ? (lazy) eklendiğinde, motor mutlak minimum değeri tüketir ve modelin bir sonraki eşleşmesini ararken her seferinde bir karakter ilerler.

Deneyin

Egzersiz#regex.m2.l3.e1
Denemeler: 0Yükleniyor…

Tembel sürümünü `.*?` kullanarak örnekteki her HTML etiketini (ör. `**`, `**`, `*`, `*`) çıkarın.

Düzenleyici yükleniyor…
İpucu göster

Açgözlü <.*> ilk etiketin başından sonuncunun sonuna kadar eşleşir. Tembel <.*?> ilk karşılaştığı yerde durur.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#regex.m2.l3.e2
Denemeler: 0Yükleniyor…

Metindeki çift tırnak arasındaki her dizeyi çıkarın (ör. "ciao", "mondo"). Daha sonraki kapanışlara atlamaktan kaçınmak için niceleyicinin tembel versiyonunu kullanın.

Düzenleyici yükleniyor…
İpucu göster

".*?" ilk kapanış çift tırnakta durur.

3 denemeden sonra çözüm mevcut

Ek zorluk

Egzersiz#regex.m2.l3.e3
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İpucu göster

Açık parantez için \\[ kullanın, ardından .*? ve son olarak kapalı parantez için \\].

3 denemeden sonra çözüm mevcut