
Regexp Kullanım Seviyeleri
Regexp ile üç farklı seviyede işlem yapılabilir.
1. Mantıksal işlem seviyesi
Desenimizi, bir metnin (string) üzerinde çalıştırıp, en az bir eşleşme yakalayıp yakalamadığını kontrol etmek istiyorsak, mantıksal işlem seviyesinde bir desen kullanımına ihtiyacımız var demektir. Meselâ elimizdeki bir metnin, gramerine uygun bir e-mail adresi olup olmadığını kontrol edebilmemiz için; desenimizin çalıştırılmasından geriye, doğru (True) veyâ yanlış (False) şeklinde bir boolean değer dönmesi yeterlidir. Bu iş için PHP’de “preg_match” fonksiyonunu kullanmanızı tavsiye ediyorum.
2. Yakalama seviyesi
İkinci seviye, karmaşık bir metnin içinden bir takım gerekli bilgileri ayıklamak istediğimizde (parse) kullanılır.
Meselâ bir HTML kod içinden, img tag’leri ile yer verilmiş resimlerin adreslerini (yukarıdaki örnek için “resim/yolu/dosya_ismi.png”) almak istediğimizde, bu seviyede bir işlem yapacağız demektir.
PHP’de bu işi gören tavsiye edeceğim iki fonksiyon var; birisi “preg_match”, diğeri “preg_match_all”. İsimlerinden de anlaşıldığı gibi, ilk fonksiyon metinden bir tek eşleşme yakalamaya, ikincisi ise desene uyan bütün eşleşmeleri yakalamaya yarıyor.
Bâzen metinden ayıklamak istediğimiz kısım, zâten bir kere geçmesi gereken bir bilgidir, daha fazla geçse bile bizi ilgilendirmiyordur. Bâzen de yazdığımız desen, kendi tabiati itibariyle sâdece bir sonuç döndürebilecek kabiliyettedir. Bu gibi durumlarda “preg_match” kullanmak; hem kullanım pratikliği, hem de performans açısından fayda sağlar. Diğer bütün durumlar için, behemehal “preg_match_all” kullanırız.
3. Değiştirme seviyesi
Üçüncü seviye, her ne kadar en gelişmiş kullanım seviyesi olsa da, anlatması en kolay olanı. Bir metnin içinde geçen ve bizim desenimize uyan bütün eşleşmeleri, istediğimiz başka bir şeyle değiştiriyoruz. Tabii burada alt-desenler (sub patterns), yâni desenin iç parçacıkları önem kazanıyor.
Yazının başındaki örneğe dönersek; “5,345.25 YTL” şeklindeki eşleşmeleri “5.345,25 YTL” şeklinde düzeltmek için, yakaladığımız her eşleşmenin bazı kısımlarını değiştirmemiz, bazı kısımlarını da olduğu gibi kullanmamız gerekiyor. Bunun için “alt desenler” kullanmamız gerekiyor ki, ileride geniş anlatacağım. PHP’de bu seviyede işlemler için, “preg_replace” fonksiyonunu tavsiye ediyorum.
Desen Gövdesi
Gelelim işin özüne, yani desenin gövdesini yazmaya. Bunun yolu da öncelikle, normal karakterler ve özel karakterleri ayırabilmekten geçer. Normal karakterler, yazıldığı yerde sadece kendisini temsil eden karakterlere denir. Tahmin edebileceğiniz gibi özel karakterler de, yazıldıkları yere göre özel anlamlar taşıyan karakterlerdir. Meselâ bir “a” harfi, metindeki bütün “a” harfleriyle eşleşirken, bir “*” işâreti, özel durumlar haricinde, metindeki “*” işâretleriyle eşleşmiyor.
Özel karakterleri ayırmaktaki zor taraf, çok fazla sayıda olmaları değil. Regexp desenleriyle bir müddet çalıştıktan sonra, hepsine âşinâlık kazanırsınız. Fakat bu karakterlerin bulundukları yere göre anlamlarının değişmesi, hatta bazı işâretlerin; yerine göre özel bir karakter olup, yerine göre normal karaktere dönüşmeleri işi biraz zorlaştırıyor. Bu anlamları yakalayabilmek için, bir Regexp desenini okurken gözlerinizi dört açmanız gerekiyor.
Özel karakterleri normal karakterlere dönüştürmeyi bâzen biz isteriz. Metindeki “*” karakterlerini yakalamak istediğimizde, bu karakterin özel anlamını iptâl etmemiz gerekir. Tıpkı sınırlayıcı karakterlerde olduğu gibi, bu durumda da ilgili karakterin başına gelecek bir iptal (escape) karakteri “\” derdimize derman olur.
1. Karakterler
Öncelikle bütün istisnaları gözardı ederek, özel durumlar haricinde normal ve özel karaktelerin tasnifini yapalım. Özel durumlar haricinde, “[\^$.|?*+()” karakterleri dışında kalan bütün karakterler, kendilerini temsil ederler. Yâni, bir “s” harfi, metindeki bütün “küçük s” harfleriyle eşleşir. Normal karakterlerden oluşan bir deseni, bir metne uyguladığımızda; yalnızca birebir (exact) eşleşmeleri yakalayabiliriz. Meselâ “sakla” desenindeki “k” harfi, kendi başına metindeki bütün “k” harfleriyle eşleşmez. Bir eşleşme olması için, yanındaki harflerin hepsiyle birlikte ve desende yazıldığı sırayla metinde yer alması gerekir. Yâni, “sakla” deseni, sâdece metindeki “sakla” larla eşleşir.
Metin: Bu yoğurdu sarımsaklasak da mı saklasak, sarımsaklamasak da mı saklasak?
“[” karakteri
Bir “karakter sınıfı” başlatma anlamı taşıdığı için, özel bir karakterdir. Bir karakter sınıfının başlaması, özel karakterlerde değişikliğe sebep olduğu için, ayrı bir başlık hâlinde aşağıda anlatacağım.
“\” karakteri
Buraya kadar çok defa atıfta bulunduğumuz bu karakter, özel anlam taşıyan bütün karakterlerin özel anlamlarını iptal etmeye (escape) yarar. Kendi özel anlamını dahî iptal edebilir.
Metin: Dosya yolu: c:\program files\php\ext\
“^” karakteri
Tek başına hiç bir karakteri yakalamaz. “Metnin başlangıcı” anlamını taşır.
Metin: Türkçe bilmek için Türk olmaya gerek var mı?
“$” karakteri
^ karakterine benzer. Farkı, başlangıç değil “bitiş” anlamı taşımasıdır.
Metin: Kim? Kiminle? Nerede? Ne zaman? Ne yaptı? Kim gördü? Ne dedi?
Yukarıdaki örnekte iptâl karakteri “\” kullanarak, yakalamak istediğimiz karakterin özel anlamını nasıl devre dışı bıraktığımıza dikkat edin.
“.” karakteri
Satır sonu karakterleri “\n” ve “\r” hâriç bütün karakterleri yakalar. Kısaca, “herhangi bir karakter” demektir.
Metin: Hey gidi küheylan, koşmana bak sen! Çatlarsan, doğuran kısrak utansın!
“|” karakteri
C tabanlı programlama dillerinin hepsinde olduğu gibi “veyâ” anlamı taşır. Kullanım şeklini “alternatifler” bölümününde anlatacağım.
“?”, “*” ve “+” karakterleri
Tekrar kontrolünde kullanılır. Ne işe yaradıklarını “tekrar kontrolü” bölümünde anlatacağım.
“(” ve “)” karakterleri
Alt desen (sub pattern) oluşturmada ve ihtiyâç hâlinde guruplamada kullanılır. Guruplama maksatlı kullanıldığında da yine alt desen oluştururlar. Tafsilâtını “alt desenler” konusunda anlatacağım.
2. Karakter Sınıfları
Karakter sınıfları, bir tek karakteri çok alternatifli olarak tanımlamakta kullanılır. “|” işâreti ile verilen “veyâ” anlamını, bir tek karakteri alternatiflendirirken, “|” işâreti kullanmadan verebilmeyi sağlar. Bir karakter sınıfını yazmaya köşeli parantez açma “[” karakteriyle başlar, köşeli parantez kapama “]” karakteriyle bitiririz. Bu ikili arasında, özel karakterler, dışarıdakilerden farklılık gösterir. “^-]\” karakterlerinin özel anlamları varken, diğer bütün karakterler ise kendilerini temsil eder. Yâni bir karakter sınıfı içine yazacağınız bir parantez “(“ işâreti, “alt desen” oluşturmaya yaramaz ve köşeli parantez “[” işâreti, yeni bir karakter sınıfı başlatma anlamı taşımaz.
Metin: [\^$.|?*+()
Karakter sınıflarıyla ilgili en çok unutulan husus şudur: Uzun uzun yazdığımız bir karakter sınıfı, her zaman için “bir tek karakteri” temsil eder. İçine yazdığımız normal karakterlerin dizilişi, tamâmen önemsizdir. Çünkü birbirlerine alternatif oluştururlar ve onlardan herhangi birisi ile eşleşme sağlanır. Aşağıdaki örnekte, 16 değil 21 eşleşme olduğuna dikkat edin.
Metin: Tahtadan yapılmış bir uzun kutu; baş tarafı geniş, ayak ucu dar.
Metin: Tahtadan yapılmış bir uzun kutu; baş tarafı geniş, ayak ucu dar.
Bir karakter sınıfının, desen içindeki yeri ise önemini korumaktadır. Desen içinde herhangi bir “tek karakter” nasıl yanındakilerle birlikte ve yazıldığı sırayla eşleşme anlamı taşıyorsa, bir karakter sınıfı bütünü de aynı şekilde değerlendirilir. Yâni “[ld][ıi]” şeklindeki bir desen, “l” veyâ “d” harfi ve tâkip eden “ı” veyâ “i” harfini bir arada bulursa, eşleşme sağlanır. Bu da ayrı ayrı yazıldığında “lı”, “li”, “dı”, “di” alternatiflerinin hepsi demektir.
Metin: Önde yalın kılıç Türkmen Başbuğu, ardında Oğuz’un ellibin tuğu!
“^” karakteri
Sâdece karakter sınıfının en başında yazıldığında özel anlamı vardır, ikinci ve sonraki sıralarda yazılırsa; özel karakter olmaktan çıkıp, kendisini temsil eder. Özel anlamı ise, mantıktaki “değil” (NOT) ifâdesine denk düşmektedir. Yâni, bir karakter seti bu karakterle başlarsa, içinde tanımlanan karakterler hâriç, bütün karakterlerle eşleşir.
Metin: Alan sensin, veren sen, kılan sen. Ne verdinse odur, dahî nemiz var?
Yukarıdaki örnekte “s harfi ve boşluk karakteri” hâriç bütün karakterlerle (52 adet) eşleşme sağlanmıştır.
“-” karakteri
Aralık belirterek birden çok karakteri kısaca tanımlamak için kullanılır. “a-z”, “0-9” şeklindeki kısaltmalar, programcıyı aradaki bütün harf ve rakamları tek tek yazmaktan kurtarır. Bununla birlikte, “a-z” ve “A-Z” şeklindeki kısaltmalar, Türkçe karakterleri ihtivâ etmez. “-” karakteri, karakter setinin başlangıcında yazılırsa, özel anlamını kaybederek, kendisini temsil eder.
Metin: Kelâm-ı kibâr, kibâr-ı kelâmest
Görüldüğü gibi yukarıdaki desen, “a-l” arası Latin-1 karakterler ve “-” karakteri ile eşleşme sağlamıştır.
“]” karakteri
Karakter setini bitiren karakter olduğundan, karakter seti içinde yalın hâliyle yer alamaz. Yer alması gerektiğinde, başına bir iptal (escape) karakteri “\” konulur.
“\” karakteri
Özel anlamları iptal eden bu karakter, karakter seti dışında olduğu gibi içinde de özel karakter vasfını hâiz olduğundan, kendisine işâret edilmesi gerektiğinde yan yana iki tâne “\\” yazılır.
Şol Regexp dedikleri, iki nokta bir yıldız… - 1
Yorum Yapın
Yorum yapabilmek için aşağıdaki formu kullanarak giriş yapmalısınız.
|
|
Opereysin üyesi değilseniz, önce üye olmanız gerekiyor.
Şifrenizle ilgili bir sıkıntınız varsa, sizi Kayıp Şifre Tespit Birimimize alalım.
|





















