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.
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
Tembel sürümünü `.*?` kullanarak örnekteki her HTML etiketini (ör. `**`, `**`, `*`, `*`) çıkarın.
İ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
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.
İpucu göster
".*?" ilk kapanış çift tırnakta durur.
3 denemeden sonra çözüm mevcut
Ek zorluk
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.
İ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