Yineleme

Yineleme, aşağıdaki öğeleri takibeden niceleyicilerle belirtilir:

  • Tek bir karakter; öncelenmiş olabilir.
  • Bir işleç olarak nokta.
  • Bir karakter sınıfı.
  • Bir geriye gönderim (sonraki bölüme bakınız).
  • Ayraçlı bir alt şablon (bir sav ileri sürmedikçe; aşağıya bakınız).

Genel yineleme niceleyicileri, kaşlı ayraçlar arasına alınıp virgülle ayrılmış olarak asgari ve azami miktarda eşleşme belirirler. Belirtilen sayılar 65536'dan küçük olmalı ve ilk sayı ikincisine eşit veya ondan küçük olmalıdır. Örneğin, z{2,4} şablonu "zz", "zzz" veya "zzzz" ile eşleşecektir. Kapatan kaşlı ayraç özel bir karakter değil, kendisidir. Eğer virgül konduğu halde ikinci niceleyici verilmezse bir üst sınır olmayacaktır. Eğer ikinci niceleyici virgülsüz olarak belirtilmemişse, tam olarak belirtilen sayıda eşleşme sağlanmaya çalışılır. Dolayısıyla, [aeiou]{3,} şablonu en az üç sesli harfle eşleşecektir. Ancak, \d{8} şablonu tam olarak 8 rakamla eşleşecektir. Şayet birinci niceleyici belirtilmezse veya kaşlı ayraçtan sonraki karakter bir rakam değilse kaşlı ayraç sadece kendisiyle eşleşir. Örneğin, {,6} şablonu bir yineleyici değil, dört karakterden oluşan sıradan bir dizgedir.

Bir yineleyici olarak {0} şablonuna izin verilir ve ifadenin, önceki öğe ve niceleyici hiç yokmuş gibi davranmasına sebep olur.

Geriye uyumluluk adına, üç yineleyici türünün tek karakterlik kısaltmalarına izin verilmektedir:

Tek karakterlik yineleyiciler
* {0,} yineleyicisine eşdeğerdir.
+ {1,} yineleyicisine eşdeğerdir.
? {0,1} yineleyicisine eşdeğerdir.

Hiçbir karakterle eşleşmeyen bir alt şablonu takibeden üst sınırsız bir yineleyici belirterek sonsuz döngü oluşturmak mümkündür. Örnek: (a?)*

Perl ve PCRE'nin önceki sürümleri böyle şablonların derlenmesi sırasında hata verirdi. Ancak, bu şablonlar bazen yararlı olabildiklerinden artık kabul edilmektedir, fakat hiçbir karakterle eşleşmeme durumunda döngü bilinçli olarak kırılmaktadır.

Yineleyiciler öntanımlı olarak "tamahkar" olurlar. Yani, şablonun geri kalanının başarısız olmasına sebep olmaksızın olabildiğince çok (azami niceleyicisinin izin verdiği ölçüde) eşleşme yapmaya çalışır. Klasik bir örnek olarak, C kodları arasındaki açıklamalarla eşleşme sorunları verilebilir. Bu açıklamalar /* ve */ dizilimleri arasında bulunurlar ve içlerinde birbirlerinden bağımsız olarak / ve * karakterleri bulunabilir. Örneğin, /\*.*\*/ şablonu /* birinci açıklama */ bu açıklama değil /* ikinci açıklama */ dizgesiyle eşleştirilmeye çalışıldığında başarısız olunacaktır. Çünkü .* öğesinin tamahkarlığı yüzünden dizgenin tamamı ile eşleşecektir.

Bununla birlikte, bir yineleyicinin ardına bir soru imi konursa, tamahkarlığa son verilmiş olur ve olası en az sayıda eşleşme yapılmaya çalışılır. Dolayısıyla, /\*.*?\*/ şablonu C açıklamaları ile beklendiği gibi eşleşir. Yineleyiciler, anlamları değiştirilmediği sürece sadece tercih edilen sayıda eşleşme yapacaktır. Soru imini, bir yineleyici olarak kendisinin sonrasına koymaktan çekinmeyin. İki çeşit kullanımı olduğundan bazen \d??\d örneğindeki gibi bir soru imi çifti olarak görünür ve tercihan tek bir rakamla eşleşirse de şablonun kalanının eşleşmesi için başka çare yoksa iki rakamla da eşleşir.

PCRE_UNGREEDY seçeneği (Perl'de bulunmayan bir seçenektir) etkinse yineleyiciler öntanımlı olarak tamahkar olmazlar, fakat bir yineleyiciyi takibeden bir soru imi varsa o yineleyici tamahkarlık gösterebilir. Başka bir deyişle, bu seçenek öntanımlı davranışı tersine çevirir.

+ imi yineleyicilerin ardına konduğunda yineleyiciyi bencilleştirir. Yani, şablonun kalanının başarısızlığı pahasına olabildiğince çok eşleşme yapmaya çalışır. Bu bakımdan, örneğin, .*abc şablonu "aabc" ile eşleştiği halde .*+abc şablonu eşleşmeyecektir. Çünkü .*+ dizgenin tamamını yiyecektir. Bencil yineleyiciler işlemi hızlandırmak için PHP 4.3.3'ten beri kullanılabilmektedir.

Bir yaylı ayraçlı alt şablon, 1'den büyük bir asgari ve sınırlı bir azami yineleme değeriyle nicelendiğinde derlenmiş şablon için asgari ve azami değerlerin büyüklüklerine bağlı olarak daha fazla alan gerekir.

Eğer bir şablon, .* veya .{0,} ile başlıyorsa ve (Perl'in /s seçeneğine eşdeğer) PCRE_DOTALL seçeneği etkinse, noktanın satırsonu karakterleriyle eşleşmesini sağlamak için, eşleşmeye konu dizgedeki karakterleri şablonun kalanı ile eşleştirmek adına, şablon örtük olarak satırsonlarına demirlenir. Dolayısıyla, ilkinden sonraki eşleşmeler için yineleme gereği kalmaz. PCRE böyle bir şablonu \A ile öncelenmiş gibi ele alır. Eşleşmeye konu dizgenin satırsonu karakterlerini içermediğinin bilindiği durumlarda, demirleme işlemini dolaylı olarak belirtmek amacıyla ^ kullanmak veya bu en iyilemeyi sağlamak için şablon .* ile başlatıldığı takdirde PCRE_DOTALL seçeneğini etkin kılmak akıllıca olur.

Bir yakalayan alt şablonun yinelenmesi durumunda, alt şablonun eşleştiği alt dizge son yineleme ile eşleşen alt dizgedir. Örneğin, (tweedle[dume]{3}\s*)+ şablonu "tweedledum tweedledee" dizgesiyle eşleştirilmeye çalışıldığında eşleşen alt dizge "tweedledee" olur. Bununla birlikte, iç içe yakalayan alt şablonların varlığında, alt şablonun eşleştiği alt dizge önceki yinelemelerle eşleşen alt dizgeler olabilir. Örneğin, /(a|(b))+/ şablonu "aba" ile eşleştirilmeye çalışıldığında eşleşen ikinci alt dizge "b" olur.

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top