Regular Expression

Merhabalar,

Bugün yeni gelen bilgisayar masamın ÅŸerefine bir yazı yazmak istiyordum ama öyle boÅŸu boÅŸuna yazı yazamayacağım için arada sizlere regular expression’dan bahsetmek istiyorum :)

Öncelikle sizlerin de yazılım hayatınıza baÅŸlayalı 5~10 yılı geçtiyse artık etraf koddan geçilmez hale gelir. Her yerde baÅŸka kodlar, hepsinize siz yazmışsınızdır ama.. “kardeÅŸim ne yazmışım yaa, bu kadar da olmaz ki”.. dersiniz. Daha sonrasında kendinizi birÅŸeyler araken ve en önemlisi bulumazken bulacaksınız.. “ahh nereye koymuÅŸtum bunu salak ÅŸeyi..” dersiniz.. tekrar dersiniz.. ama bunu söylemenin bir etkisi yoktur, gene bulamazsınız.. gene bulamazsınız.

Ya da size bir iÅŸ verirler. RegEx (Regular Expression) kullanmanız gerekir.. Gerekir gerekir gerekmez demeyin. Örnek vermek gerekir ise, geçen gün Zodazone Türkiye’de belirli bir tabloda yer alan açıklama bilgilerini deÄŸiÅŸtirilmesi istendi üstlerden bir yerlerden (ne biliyim muhasebeden falan iÅŸte..).

Bize bir ofis dökümanı içerisinde tekil kod bilgisini ve yanında yeni açıklamasını gönderdiler.. Onlar oturmuÅŸ kasmış… hatta uÄŸraÅŸmış sabahlara kadar 150 civarındaki açıklamayı kafa patlatmışlar, düşünmüşler, taşınmışlar.. ve deÄŸiÅŸtirmiÅŸler.. Tabii ne zennetiniz sadece bunun için maaÅŸ alan adamlar bile mevcut.

Ehh tabii bu Tankut kardeÅŸiniz oturup, 150 tane açıklama alanını tek tek yapacak hali yok. Deli miyim ben :) söz meclisten dışarı efenim :) Neyse ÅŸimdi bu dökümanı gönderdiler ya içerisinde sadece açıklama bilgisi bulunmuyor ki, kim bilir hangi düzenle yazdılar bu dökümanı diye bir düşünün bakalım.. Regular Expression olmadan adım atamazsın adım….

Neyse öncelikle güzel güzel açıklayalım bu RegEx nedir, ne değildir ?
RegEx, karakter yığınları içerisinde özel belirtilen karakter veya karakter kümelerini bulmak, diğerlerinden ayırmak için kullanılan oldukça gelişmiş bir kütüphanedir. Kullanımı biraz zordur, hemen kısa sürede alışmanız zor olabilir.

Öncelikle RegEx tanımlarını ve anahtar kelimelerini tanıyalım; (Kitap yazmıyoruz burada ona göre.. tüm özelliklerini yazmıyorum sadece çok kullandıklarımı)

Anahtar kelimeler:
^ : Satır başını ifade eder.
\n : Enter karakteri için kullanılır.
\t : Tab karakteri için kullanılır
[…] : Örnek: [aeıioöuü] sadece sesli harfleri bulunur. ‘[]’ karakterleri içerisinde yer alan herhangi bir karaktere uyanları getirir.
[^…] : Örnek: [^aeıioöuü] sadece sessiz harfleri bulunur. ‘[^]’ karakterleri içerisinde yer alan herhangi bir karaktere uymayanları getirir.
. : Yeni satır (\n) karakteri hariç herhangi bir karakteri ifade eder. Tek karakteri
\w : Herhangi bir alfanumeric veya numeric karakteri iÅŸaret eder. a..z, A..Z, 0..9
\W : \w’nin tersidir.
\d : \d herhangi numeric karakter.
\D : \d’nin tersi.
\ : bir sonraki karakter özel bir anlam ifade ediyorsa, bu özelliği iptal eder.

Destekleyiciler
? : Bir önceki karakterden bir tane var ise bulur.
+ : Bir önceki karakterden bir ve birden fazla var ise.
* : Bir önceki karakterden 0 ve birden fazla var ise.
{n} : Bir önceki karakterden n adet olanları bulur.
(…) : Gruplama iÅŸlemi yapar. ‘()’ içerisine yazılanlar grup olarak deÄŸerlendirilir.
| : ‘OR’ iÅŸlemi için kullanılır, 2 farklı RegEx bu ÅŸekilde baÄŸlanabilir.

Opsiyonlar:
i : Büyük küçük harfe duyarlı olmaz.
m : Karakter katarını birden çok satırmış gibi düşünür.
s : Karakter katarını tek satırmış gibi düşünür.

Kolay gelsin.. :)

Regular Expression” üzerine 7 yorum

  1. uvvv ne güzel yazı olmuş bu :)

    11000 bounce etmiÅŸ mailin ufak bir hata sonucu mail box’ıma download’undan sonra…
    hepsini tek tek kontrol edip mail adreslerini excel sheet’e yazamayacağıma göre :) aklıma hemen regEx geldi.

    Ufak bi araÅŸtırmadan sonra http://www.regular-expressions.info/ sitesinde keÅŸfettiÄŸim “powergrep” gibi bir program sayesinde yaklaşık 20 dk. içinde tüm mail adreslerini tek bir txt dosyasına kopyalamıştım.

    Önünde saygı ile eğiliyoruz RegEx :)

    dip not: Yazılım hayatım 5-10 yıl önce başlamadı ama başlamış olan güzel abilierime teşekkürü bir borç bilirim :)

  2. Ä°yiki yazdık “kısa sürede alışmanız zor olabilir” diye, sen otur 20 dakkida çöz. Ben öyle yazdım ya inadına yaptın deÄŸil mi :)

  3. Ben “PowerGREP” sayesinde demiÅŸtim ama :) ( editplusta yazamadım yeminle RegEx. )
    Alışılması gerçekten zor :) hele hele Tankut’ın dediÄŸi gibi “kısa sürede alışmak çokkkk zor” :)

  4. Ruby kullananlar Ruby’nin RegEx’e doÄŸal desteÄŸi olduÄŸunu bilirler muhtemelen. Belki yazının sonunda bir ufak örnek olsaydı güzel olurdu diye düşünüp hemen bir örnek yapmaya karar verdim.

    string1 = “I will drill for a well in walla walla washington.”
    if string1 =~ /(w.ll)/
    print “Matched on “, $1, “\n”
    else
    puts “NO MATCH”
    end

    =~ operator’u regular expression kullanarak kontrol yapar. BulduÄŸu ilk deÄŸeri $1 deÄŸiÅŸkenine atar. Ä°kinci bulduÄŸu deÄŸeri $2, $3 diyerek eriÅŸebiliriz.

  5. Son söz,

    Regular Expressions hayat kurtarır, öğrenin.

    Dalgıçlıkta kullanılan bir söz vardır, biraz bu söze benzer;
    “Bıçağınızı yanınızdan ayırmayın, genellikle ihtiyacınız olmaz. OlduÄŸunda yanınızda bıçak yoksa bir daha hiç ihtiyacınız olmaz.”

    Kolay gelsin.

  6. Burada pek C#’tan bahsedilmiyor ama bu regex ile ilgili biliyorsunuz .NET’te de System.Text.RegularExpressions isimli bir isim uzayı bulunmakta, ÅŸimdi soru ÅŸu VS2005 IDE’nin “Find And Replace” aracı ile aÅŸağıdaki deÄŸiÅŸimi gerçekleÅŸtirebilirsiniz.

    Text : AliVeliAhmet AliMertAhmet AliKurtAhmet
    Find : Ali{….}Ahmet
    Repplace : Selam \1 Nasılsın ?
    Result : Selam Veli Nasılsın ? Selam Mert Nasılsın ? Selam Kurt Nasılsın ?

    Gel gelelim (Niye geliyorsak !) aynı iÅŸi yukarıdaki isim uzayı altında yer alan regex sınıfı’nın saygıdeÄŸer üyesi Replace(…) metoduna yaptırmak hayli zor.

    “Find & Replace” aracında yer alan Tagged Expression (yani “{}” iÅŸaretleri arasındaki deÄŸerler) regex sınıfı ve metodları tarafından nasıl yorumlanıyor bilmiyorum ama aynı örneÄŸi regex.replace(…) metodu ile ben gerçekleÅŸtiremedim.

    Bir fikri olan var mı acaba ?

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir