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.

add a note add a note

User Contributed Notes 1 note

up
-4
daevid at daevid dot com
11 years ago
removes // comments but NOT the stuff after http://

$sBlob = preg_replace("@\s*(?<!:)//.*?$@m",'',$sBlob);

Although, as Sean Greenslade pointed out, it will fail in this EDGE case since the comments are within quotes, but who does that anyways?

"Lol slashes // are // fun";
To Top