İç içe şablonlar
Sınırsız iç içe yaylı ayraçların kullanıldığı bir şablonu yaylı
ayraçlar arasındaki bir dizgeyle eşleştirme sorununu ele alalım.
Ardışık işlem haricinde yapılabilecek en iyi şey iç içe sabit bir
derinliğe kadar eşleşebilecek bir şablon kullanmaktır. Sabit olmayan
derinlikli iç içe şablonları işlemek mümkün değildir. Perl'in 5.6
sürümü, ardışık (iç içe) düzenli ifadelere izin veren deneysel bir
oluşuma sahiptir. Belli bir ardışıklık durumu için özel bir öğe, (?R)
öğesi sağlanmıştır. Bu PCRE şablonu yaylı ayraçlarla ilgili bu sorunu
çözmektedir: \( ( (?>[^()]+) | (?R) )* \)
(Boşlukların gözardı edilmesini sağlayan
PCRE_EXTENDED
seçeneğinin etkin olduğu varsayılmıştır.)
İlk eşleşme bir açan yaylı ayraçla olur. Sonraki eşleşme, ya yaylı
ayraçlar içine alınmamış bir dizi alt dizgeyle olur ya da şablonun
kendisi ardışık olarak (doğru olarak yaylı ayraçlar içine alınmış alt
dizgelerle) eşleşir. Ve son eşleşme bir kapatan yaylı ayraçla olur.
Örnek olarak verdiğimiz bu şablon sınırsız sayıda iç içe yineleme
içerir; dolayısıyla şablon, eşleşmeyeceği dizgelere uygulandığında,
yaylı ayraç içine alınmamış dizgelerle eşleşmek için sadece bir kerelik
alt şablonların kullanımı önem kazanır. Bu duruma bir örnek olarak çabuk
bir eşleşmemeyle sonuçlanan şu dizge verilebilir:
(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
Bununla birlikte, sadece bir kerelik alt şablon kullanılmazsa eşleştirme
işlemi çok uzun sürecektir. Bunun sebebi, eşleşmeye konu dizgeyi çok
çeşitli şekillerde bölen + ve * yinelemelerinin olması ve bir
başarısızlık raporlamadan önce bunların hepsinin denenmesi gereğidir.
Herhangi bir yakalama alt şablonu için belirlenmiş değerler, alt şablon
değerinin atandığı ardışık işlemin en dış seviyesindeki değerlerdir.
Eğer yukardaki şablon, (ab(cd)ef)
dizgesiyle
eşleştirilmeye çalışılırsa yakalanan ayraçlı değer, en üst seviyede
elde edilen son değer olan "ef" olur. Eğer başka yaylı ayraçlar da
eklenirse,
\( ( ( (?>[^()]+) | (?R) )* ) \)
şablonu ile
yakalanan dizge, en üst seviye yaylı ayraçların içindeki "ab(cd)ef"
olur. Eğer bir şablonda 15'ten fazla yakalayan yaylı ayraç varsa, PCRE
ardışık bir işlem sırasında veriyi saklamak için pcre_malloc ile
ayırarak ve işi bitince pcre_free ile serbest bırakarak fazladan
bellek sağlamak zorundadır. Eğer bu bellek ayrılamazsa, bir ardışık
işlem sırasında bellek yetersiz hatası vermek mümkün olmadığından
veriyi, sadece ilk 15 yakalayan yaylı ayraç için saklar.
(?1)
, (?2)
ve
benzerleri ardışık alt şablonlarda da kullanılabilmektedir. Ayrıca,
(?P>isim)
veya (?P&isim)
isimli alt şablonlarını da kullanmak mümkündür.
İsimli veya numararalı bir ardışık alt şablon gönderim sözdizimi,
gönderimde bulunduğu yaylı ayraçların dışında kullanılmışsa bir
programlama dilindeki bir alt yordam gibi işlem yapar. Önceki
örneklerden birinde, (sens|respons)e and \1ibility
şablonu "sense and sensibility" ve "response and responsibility" ile
eşleşiyor, fakat "sense and responsibility" ile eşleşmiyordu. Eğer
(sens|respons)e and (?1)ibility
şablonu kullanılmış
olsaydı diğer iki dizgeyle birlikte "sense and responsibility" dizgesi
de eşleşecekti. Böyle gönderimlerin, yine de atıfta bulunduğu alt
şablondan sonra gelmesi gerekir.
Eşleşmeye konu dizgenin azami uzunluğu bir tamsayı değişkenin
tutabileceği en büyük pozitif tamsayı kadar olabilirse de PCRE ardışık
işlem yaparak sonsuz sayıda yinelemeyi ve alt şablonu işleyebilir. Bu
bakımdan, belli bir şablon tarafından işlenebilecek bir dizgenin
uzunluğunu sınırlayan şey aslında, kullanılabilecek yığıtın
büyüklüğüdür.