
Türkçe’ye “Düzenli İfâdeler” diye tercüme etmişler. Regular Expressions gibi programcının eli ayağı olan bir âlet için ne tuhaf bir isim. Bâzen Türk programcıların bu saçma tercümeler yüzünden yeni teknolojilere zamanında intibak edemediğini düşünüyorum.
Kısaca Regexp diye geçer bir çok yerde. PCRE (Perl Combatible Regular Expressions) diye görürseniz de şaşırmayın. POSIX târihini, UNIX’teki kullanımını filân es geçersek, bugünkü şöhretini Perl ile yakalayan ve bugün bir çok programlama dilinde rastlayabileceğiniz, son derece kullanışlı bir âlettir. En çok da PHP programcıları kullanır, bunu da söylemeden edemeyeceğim, varsın yine PHP reklâmı yapıyor desinler.
Programcıların işlerinin çoğu, string tipi değişkenlerledir. Rakamlarla olan işler kolaydır; çarparsın bölersin, daha olmadı üssünü alırsın sonuca ulaşırsın. Ama yazılarla uğraşırken işler öyle kolay olmaz. 500 sayfalık bir katalogda, 5.345,25 YTL şeklinde yazılması gereken bütün fiyatlar 5,345.25 YTL şeklinde hatalı yazılmış olsa, hepsini birden nasıl düzeltirsiniz? Kısacık bir Regexp deseniyle PHP bu işi sâniyeler içinde yapar.
Desen ya da Pattern
Bu arada şu “desen” kelimesi de İngilizce “pattern”in tercümesi. İşin doğrusu çok da yersiz bir tercüme değil. El işine meraklı hanımlar sağda solda gördükleri kazak, dantel türü şeylerin “desenini” nasıl ilgiyle inceler, ondan “örnek” çıkartırlar bilirsiniz. Deseni, yâni belli bir kurala uygun tekrar eden en ufak parçayı bulduğunuz zaman, işin gerisi kolaydır. Kazak deseninde olduğu gibi…
E-mail, telefon numarası, URL, tarih gibi bilindik bazı şeyleri yakalamak için geliştirilmiş desenleri, Regexp konusunda hiç bilgisi olmayan programcılar da kullanırlar. Üstelik bunu hanımların dantel deseni kopyalamalarından bile kolay yaparlar. Sağdan soldan buldukları hazır desenleri kopyalaya yapıştıra deneyerek, en işlerine yarayan desende karar kılarlar. Dahası, bu tip hazır desenleri bulabileceğiniz, desen kütüphanesi olarak hizmet veren siteler vardır.
Programlamayla uğraşıyorsanız –ki yazıyı buraya kadar okuduysanız muhtemelen öylesiniz– ve şimdiye kadar Regexp’le mesafenizi hep koruduysanız, arada sırada kopyalayıp yapıştırdığınız o desen kodları, muhtemelen size hep Çince gibi gözükmüştür. Telaşa mahal yok, bunu asla anlayışınızın kıtlığına yormayın, Regexp grameri pek okunaklı değildir. Bir çok kişinin kaybettiği nokta da burası olur. Açıldığı sırayla kapatılmamış parantezler, peş peşe saçma sapan karakterler… Çıkacağınız ilk basamak, bir regexp deseninde gördüğünüz her bir karakterin ve dizilişlerinin kesinlikle bir mânâsı olduğunu kabul etmek olacaktır. Birisi o mânâyı çıkartabiliyorsa, pekâlâ siz de yapabilirsiniz. Bu kadar gaz yeterli motivasyonu sağlamadıysa, burada okumayı bırakın. Çünkü bir sonraki paragraftan itibaren, dalışa geçiyorum.
Sınırlayıcı karakterler ve ayarlar
Regexp desenleri iki kısımdan oluşur; birinci kısım desenin kendisidir, ikinci kısımda da nasıl çalışacağı ile ilgili ilâve ayarlar (modifiers) yer alır. Desenin esas gövdesi, sınırlayıcı karakterler (delimiters) arasına yazılır; ayar parametreleri de kapanış sınırlayıcısından sonra hemen bitişiğe yazılır.
Meselâ bu desende sınırlayıcı karakter olarak “/” kullandım, desenin kendisi “[a-z]+” ve tahmin ettiğiniz gibi “i” harfi de bir ayar. Devam etmeden önce hemen merakınızı gidereyim: i harfi desenin büyük / küçük harf hassasiyeti olmadan (insensitive) çalışmasını sağlıyor.
Buraya kadarki yazdıklarımdan da anlaşıldığı gibi, sınırlayıcı karakteri seçmek bizim elimizde. Her ne kadar bir çok hazır regexp desende, kural gibi “/” karakterinin kullanıldığını görmek mümkünse de, aslında böyle bir kural yok. Bence programcının ilk ve en önemli ihtiyacı, ufkunun açık olmasıdır. O yüzden bu noktayı aydınlatmayı önemli buluyorum.
Sınırlayıcı karakterinizi seçerken dikkat etmeniz gereken şey, desenin içinde o karakterin geçmiyor olmasıdır. Tabii geçiyorsa dünyanın sonu değil, başına bir “\” işareti koyarak etkisiz hâle getirebilirsiniz (escape). Ama kim zâten yeterince karışık olan deseni, gereksiz ilave karakterlerle daha okunmaz hâle getirmek ister ki? Ben çoğunlukla sınırlayıcı olarak “@” işâretini tercih ediyorum. E-mail adresleriyle ilgili bir desen yazarken kullanışlı olmayacağı kesin, diğer desenlerde ise son derece işe yarıyor.
Perl, Javascript gibi bazı dillerde Regexp desenleri, ayrı bir nesnedir ve aşağıdaki gibi yazılabilir.
PHP’de ise Regexp desenleri, ilgili fonksiyonlara string olarak verildiğinden ancak aşağıdaki gibi yazılabilir.
Bu da pratikte, işin içine bir sınırlayıcı karakter daha girmesi demektir. Yâni deseninizde string sınırlayıcı olarak kullandığınız tek veyâ çift tırnak karakteri geçerse, onları da başına “\” koyarak etkisizleştirmeniz (escape) gerekir.
$desen=”/[a-z']+/i”;
String olarak yazıldığında, sınırlayıcı karakterlerin gereksizleştiği bir gerçek, desen ile ayarları ayıracak bir tek karakter bütün işi hallederdi. Hatta PHP’de ayarlar (modifiers), ilgili fonksiyonlara ayrı parametreler olarak bile verilebilirdi. Ama görünen o ki PHP’yi yazanlar, programcıların geçmişten gelen alışkanlıklarını bozmamak için, sınırlayıcı karakter (delimiter) kavramını korumuşlar.
Gelecek Bölüm:
Regexp Kullanım Seviyeleri ve Desen Gövdesi – 1








Fikir Beyan Edin
