Koşullu alt şablonlar
Eşleşme sürecinin, bir savın veya önceki bir yakalayan alt şablonun
eşleşme sonucuna bağlı olarak, bir şablona koşullu olarak boyun eğmesi
veya iki olasılık arasında seçim yapabilmesi mümkündür. Koşullu alt
şablonların olası iki çeşidi şunlardır:
(?(koşul)evet-şablonu)
(?(koşul)evet-şablonu|hayır-şablonu)
Koşul sağlandığı takdirde evet-şablonu, aksi takdirde hayır-şablonu
uygulanır veya hiçbir şablon uygulanmaz. Koşullu alt şablonda ikiden
fazla olasılık varsa derleme sırasında hata oluşur.
İki çeşit koşul vardır. Eğer yaylı ayraçlar arasındaki metin rakamlardan
oluşuyorsa koşulun içerdiği sayıların önceki yakalayan alt şablonlarla
eşleşeceği varsayılır. Şablonu daha okunabilir kılmak için boşluk
karakterlerinin yok sayılmakta olduğunu
(PCRE_EXTENDED
seçeneği) varsayarak boşluklarla üç parçaya bölünmüş şu şablonu ele
alalım:
İlk parça bir açan yaylı ayraç ile eşleşir ve karakter mevcut olduğu
takdirde bu, ilk yakalayan alt dizge olur. İkinci parça yaylı ayraç
olmayan bir veya daha fazla karakterle eşleşir. Üçüncü parça ise bir
koşullu alt şablon olarak, ilk yaylı ayraçlı grupla eşleşip
eşleşmediğine bakar; eşleşme varsa, yani eşleşmeye konu dizge bir açan
yaylı ayraç ile başlıyorsa, koşul doğrulanmış olur. Dolayısıyla
evet-şablonu çalıştırılır ve kapatan yaylı ayraç aranır. Aksi takdirde
şablon hiçbir şeyle eşleşmez. Başka bir deyişle, bu şablona göre açan
yaylı ayraçla başlayan bir dizge kapatan bir yaylı ayraçla bitebileceği
gibi bitmeyebilir de.
Eğer koşul olarak (R)
dizgesi verilmişse, şablona
veya alt şablona ardışık bir çağrı yapılmış gibi ele alınır. "Üst
seviye" için koşul daima yanlış sonuç verir.
Eğer koşul rakamlardan veya (R) dizgerinden oluşmuyorsa, bir sav olarak
ele alınır.Olumlu veya olumsuz, ileriye veya geriye bakan bir sav
olabilir. Yine boşluk karakterlerinin yok sayılacağı varsayımıyla ikinci
satırında iki olasılık içeren şu şablonu ele alalım:
(?(?=[^a-z]*[a-z])
\d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
Koşul, ileriye bakan olumlu bir sav olup, isteğe bağlı olarak harf
olmayan karakterleri takibeden bir harf ile eşleşir. Başka bir deyişle,
eşleşmeye konu dizge içinde en azından bir harfin var olup olmadığına
bakar. Eğer bir harf varsa, eşleşmeye konu dizge ilk olasılıkla, aksi
takdirde ikinci olasılıkla eşleşir, Şablon, aaa'nın harfleri, dd'nin
rakamları ifade ettiği durumda dizgenin ya dd-aaa-dd ya da dd-dd-dd
dizilimiyle eşleşecektir.