Tezler
Bir tez, herhangi bir karakterin tüketilmediği bir eşleşme noktasının
öncesinde veya sonrasındaki karakterler üzerinde yapılacak bir sınama
belirtir. Basit savlar önceleme
karakteri altında açıklandığı gibi \b,
\B, \A, \Z, \z, ^ ve $ olarak kodlanabilir. Birden fazla alt
şablondan oluşan daha karmaşık savlar da düzenlenebilir. Bunların iki
çeşidi vardır: Eşleşmeye konu dizge içinde geçerli konumun
öncesine bakanlar ve sonrasına
bakanlar.
Bir tez alt şablonu, eşleşme noktasının değişmesine sebep olmadığı
takdirde normal yollarla eşleşecektir. Eşleşme noktasının
sonrasına bakan tezler, olumlu savlar için (?=
ile, olumsuz savlar için ise (?! ile başlar. Örneğin,
\w+(?=;)
şablonu, ardına bir noktalı virgül konmuş
bir sözcükle eşleşecek, ancak ardında noktalı virgül bulunmayan bir
sözcükle eşleşmeyecektir. foo(?!bar)
şablonu ardında
"bar" bulunmayan herhangi bir "foo" ile eşleşecektir. Ancak, benzer
şekilde, (?!foo)bar
şablonu, öncesinde "foo" dışında
bir dizge bulunan bir "bar" dizgesini bulamayacak; buna karşın,
öncesinde hiçbir şey bulunmayan, ilk "bar" dizgesini bulacaktır. Çünkü
(?!foo) savı, sonraki üç karakter "bar" olduğu takdirde daima doğru
olacaktır. Bu etkiyi geriye bakan bir savla da sağlamak mümkündür.
Eşleşme noktasının öncesine bakan tezler, olumlu
savlar için (?<= ile, olumsuz savlar için ise (?<! ile başlar.
Örneğin, (?<!foo)bar
şablonu öncesinde "foo"
bulunmayan bir "bar" dizgesiyle eşleşecektir. Geriye bakan bir savın
içeriğinin eşleşeceği dizgenin sabit uzunlukta olması gerekir.
(?<=bullock|donkey)
şablonu bu kurala uyarken
(?<!dogs?|cats?)
şablonu, derleme sırasında
hataya sebep olur. Farklı uzunlukta dizgelerle eşleşen geriye bakan
şablonlara sadece olasılıkların belirtildiği alt şablonun dışında izin
verilir. Bu kural, tüm olasılıkların aynı uzunlukta dizge ile
eşleşmesini gerektiren Perl 5.005 sürümünden farklıdır. Örneğin,
(?<=ab(c|de))
savına Perl 5.005 sürümünde izin
verilmez, çünkü üst seviye olasılıklar farklı uzunlukta dizgelerden
oluşur. Ancak, şablon, (?<=abc|abde)
örneğindeki
gibi iki ayrı olasılığa bölünürse sorun çıkmaz. Geriye bakan savların
gerçekleniminde, her olasılık için, geçici olarak belli bir uzunlukta
geriye gidilip eşleşme denenir. Eğer, eşleşme noktasının öncesinde
yeteri sayıda karakter yoksa eşleşme ister istemez başarısız olur.
Geriye bakan savlar, dizge sonlarıyla eşleşmede, sadece bir kere
eşleşen alt şablonlarla birlikte kullanıldığında oldukça yararlıdır.
Böyle, sadece bir kere eşleşen alt şablon örneklerini
Sadece bir kerelik alt şablonlar bölümünde bulabilirsiniz.
Başarılı bir eşleşmede birden fazla sav bulunabilir. Örneğin,
(?<=\d{3})(?<!999)foo
şablonu, öncesindeki üç
rakam "999" olmayan bir "foo" dizgesiyle eşleşecektir. Farkettiğiniz
gibi, her sav, eşleşmeye konu dizge içinde hep aynı noktaya bağımsız
olarak uygulanır. Yapılan ilk şey, önceki üç karakterin birer rakam olup
olmadığıdır. Ancak bundan sonra o üç rakamın "999" olup olmadığına
bakılır. Bu şablon, "foo" dizgesinin önündeki, ilk üç karakteri rakam
olan ve son üç karakteri "999" olmayan altı karakterle eşleşmez.
Örneğin, "123abcfoo" dizgesiyle eşleşme sağlanamayacaktır. İstenen
eşleşmeyi sağlamak için şablonun
(?<=\d{3}...)(?<!999)foo
olarak düzenlenmesi
gerekir.
İlk sav için önce, "foo" dizgesini önceleyen altı karakterin ilk üçünün
rakam olup olmadığına bakılır. Sonra ikinci sav için altılının son üç
karakterinin "999" olup olmadığına bakılır.
Savlar çeşitli birleşimler oluşturacak şekilde iç içe düzenlenebilir.
Örneğin, (?<=(?<!foo)bar)baz
şablonu öncesinde
"foo" ile öncelenmemiş "bar" dizgeleri bulunan "baz" dizgeleriyle
eşleşir. (?<=\d{3}...(?<!999))foo
şablonu ise,
öncesinde 3 rakam ile öncelenmiş "999" içermeyen üç karakter bulunan
"foo" dizgeleriyle eşleşecektir.
Aynı savı bir kereden fazla kanıtlamanın bir anlamı olmadığından, sav
alt şablonları, yinelenemeyecekleri gibi yakalayan alt şablonlar da
olamazlar. Sav alt şablonların içerdiği yakalayan alt
şablonlar, ana şablonun tümüne ait yakalayan alt şablonlar olarak
değerlendirilirler. Bununla birlikte, bu çeşit yakalayan alt şablonlar
sadece olumlu savlarda dışa taşınırlar, çünkü olumsuz savlarda dışa
taşınacak bir şey olmaz.
Savlar en fazla 200 yaylı ayraçlı alt şablon içerebilir.