Regex Nedir?

regexBelki duymuşsunuzdur belki duymamışsınızdır. Ama şunu bilin eğerli yazılım işi ile yakından yada uzaktan ilgileniyorsanız kesinlikle çok ihtiyacınız var. Belki siz bunun bile farkında değilsiniz. Farklı yöntemler ile çözümünüzü üretiyorsunuz.

Peki nedir bu Regex?

30 seneyi aşkın bir süre önce temelleri atılarak belli bir ifadeyi belli bir kalıba göre bulmanızı, değiştirmenizi yada parçalamanızı sağlayan küçük ve kullanışlı bir yazılım dilidir. “Regular Expression”‘in kısaltılmasıdır. Yani Düzenli ifadeler. Yazı(text) içerisinde belli bir kelime yada daha karmaşık olan belli bir dizilime sahip bir bilgiyi aramanızı yardımcı olur. Bu arama işlemlerin de belli bir kural dahilinde uzunluk ve şekil belirtip buna uygun verileri filtrelememizi sağlıyor. 

Diğer diller gibi bir çok farklı kelime ve kuralı yok. Basit sade ve az kurallı bir dildir. Aslında dilden ziyade bir çok dil içerisinde bir paket olarak gelmektedir. Php, .Net dilleri, C++, Ruby, Python gibi diller de içerisinde tümleşik olarak geliyor.

Hani bir veriyi düzenli ve kurallı olarak arayabileceğimizi söylemiştik ya. Şimdi ufaktan bir göz atalım.

Diyelim ki bir yazı içerisin de Ayşe kelimesini aratmak istiyoruz. Bu kısım basit. Ama Ayşe ismini aynı zamanda Ayse olarak ta aratmak istiyoruz ve tam olarak bu şekilde büyük harfler ile yazılmış olarak arıyoruz. Bu durumda işler biraz daha karışıyor. Çünkü dosya içerisinde iki defa aramamız gerekiyor. Fakat Regex ile bu durum biraz farklı.

Ay[şs]e şeklin de bir Regex ifadesi kullanarak hem Ayşe hemde Ayse ismini aynı anda arayabiliriz. Yada satır başı Ayşe ile başlayan diye aratmak istediğimiz zaman ise

^Ay[şs]e şeklinde kullanmamız yeterli olacaktır. Farklı bir açıdan bakalım, bu sefer cümlenin başın da değil de sonunda olmasını istiyor isek;

Ay[şs]e$ şeklinde yazmamız yeterli oluyor. 

Üstte ki kısa örnekte Regex’in basit ve kısa olarak ne şekilde kullanılabileceğine çok iyi bir örnek.

Peki bu yazdıklarımızı nerede deneyebiliriz dediğinizi düşünüyorum(demiyorsanız da deyin o kadar ilgisiz olmayın) ve benim bu işlem için kullandığım araçları size söyliyeyim.

Öncelikle ücretsiz ve kullanışlı bir araç olan Notepad++ içerisinde kullanabilirsiniz. Arama kısmında sol en altta “Kurallı İfadeler” ile arama yapabilirsiniz. Notepad++ ile büyük veriler içerisinde arama ve değiştirme işlemlerini yapabilirsiniz ama benim size asıl tavsiyem RegexBuddy olacaktır. Hem kod renklendirmesi  hem hazır Regex arşivi ile hemde bir çok programlama dili için ne şekilde kullanabileceğinizi size vermesi ile çok kullanışlı bir araç. Bundan sonra anlattıklarımın tamamını RegexBuddy ile denediğini varsayarak ilerliyeceğim.

Regex için küçük bir programlama dili demiştim. Her programlama gibi bunda and ve or işlemleri var. Diğerlerinden biraz farklı olsa da mevcut ve oldukça da kullanışlı.

Yada İşlemi

erhan|barış ile bir yazı içerisinde erhan yada barış ismini arıyoruz. | karakteri bizim yada manasına gelmektetir. Eğer ki bir kelime olarak değil de sadece bir karakter arıyorsak bunu daha farklı bir yolla da yapabiliriz. Diyelim ki Hexadecimal karakterleri arıyoruz, yani a harfi ile f harfi arasında ki harflari. O zaman [a-f] yazabiliriz. Bunun manası a harfi ile f harfi arasında tek karakter olması gerekiyor. Bunu (a|b|c|d|e|f) şeklinde de yazabiliriz ama biraz daha uzun bir iş yapmış oluyoruz. Her ikisi de aynı manaya gelmektedir. 0-9 arasında ki sayıları da seçebilirsiniz. buna fazla kafanızı yormayın daha sonra daha ayrıntılı olarak inceleyeceğiz.

Veİşlemi

Bu kısım da & gibi birşey bekliyorsanız yanılıyorsunuz. Burada ve işlemi için bir karakter yok çünkü yazmış olduğunuz heryer bir bütün olarak değerlendiriliyor ve and işlemi yapmış oluyorsunuz. Yani üst kısımda ki and işlemi  var iken derken biraz daha açabilirdim :) Ama eğer ki bir and işlemi olarak değerlendirebileceğiniz gruplama işlemi var

Grup İşlem

(erhan|barış) ile erhan ve barış kelimelerini gruplamış oluyoruz. Bu kısım biraz değişik çünkü gruplama ile kast ettiğimiz tek bir veri oluşturmadır. Şöyle anlatırsam daha iyi anlayacağınızı düşünüyorum. Diyelim ki bir cümle arıyorsunuz. Aradığınız cümle de “Merhaba Dünya” yada “Merhaba Mars” olsun. Eğer ki bu cümle var ise Dünya yada Mars olan kısmı Erhan Barış olarak değiştirmek istiyorsunuz. Bu durumda Dünya ve Mars kısmına odaklanıp sadece o kısmı değiştirmemiz lazım. Aslında gruplama ile kast ettiğim seçme yada odaklanmadır. Bu dediğimi Regex olarak yazmak gerekirse;

Merhaba (Dünya|Mars) ile Dünya yada Mars kelimelerini Merhaba kelimesine dokunmadan değiştirebilirim. Tabi değiştirme dışında parçalama/bölme işleminide yapabiliriz. Bu kısım üzerinde daha sonra tekrar durucaz. Çünkü gruplama işlemi hem biraz kapsamlı hem biraz da karışık. İlerleyen konuda anlatacağım.

Aralık Belirtme İşlemi

Aslında ufaktan bu konuya yada işlemi içerisinde değinmiştirm. Gerçekte yada işleminin biraz daha gelişmişi diyebiliriz buna. [a-f] ile a karakteri ile f  karakterini alabileceğimizi söylemiştik. ama iş bununla da sınırlı değil. sayı aralığı belirtme yada birden fazla aralık belirterek uyan birisini gösterme işlemi yapabiliriz. Hexadecimal olanları bulan Regex’imiz aslında sakat bir örnek olduk. Çünkü tam olarak işlevini yerine getirmiyordu. Örneği bir adım daha geliştirelim. [a-fA-F0-9] ile bir önce ki örnekten  biraz daha farklılaştı. Burada yapılan işlem a-f arasında yada A-F yada 0-9 arasında olan karakterleri getirmesini sağladık. Dikkat ederseniz “-” ile aralık belirttik, yanına yazılanlar ise yada koşulunu oluşturdu. Bunu eğerki uzun uzun yazmamız gerekseydi iki farklı şekilde yazabilirdik. İlki;

(a|b|c|d|e|f|A|B|C|D|E|F|0|1|2|3|4|5|6|7|8|9), ikincisi ise;

[abcdefABCDEF0123456789] şeklindedir. Her biri aynı işlemi yapmaktadır ama daha uzun olarak yazıldı.

Dikkat ettiyseniz buraya kadar olan kısımlarda ya kelime aranıp değiştirildi yada bir karakter arandı. Belli sayıda karakter arama işlemi yapılmadı. Bunun içinde farklı ifadeler var.

  • * : Yıldız işareti sıfır yada daha fazla karakter manasına gelmektedir.
  • ? : Soru işareti sıfır yada bir karakter manasına gelmektedir.
  • + : Artı işareti ise bir yada daha fazla manasına gelmektedir.
  • . : Nokta işareti herhangibir karakter manasına gelmektedir. Sadece enter tuşunun yerine geçmemektedir.

Dikkat edilmesi gereken ufak birkaç yer var. *,? ve + karakterinin başında mutlaka bir şart yada karakter olması gerekiyor. Fakat .(nokta) için böyle birşey zorunluluk yok. Yani a+ bir tane yada daha fazla a karakteri olabilir manasına geliyor ama tek başına + karakterinin bir anlamı yok. .(nokta) ise tek başına kullanılabilir.

Eksik kalan Hexadecimal sorgumuza artık nokta koyma zamanı geldi. Şimdi bir karakterden daha uzun olması gerektiğini söylememiz lazım.

([a-zA-F0-9]+) işte bu kadar.

Birde kesin boyut sorgulaması yapabilmemiz için özelliği var. Mesela kullanıcı adı en az 8 karakter uzunluğunda olmalıdır. Bunun için süslü parantez içerisinde şartlarımızı yazıyoruz. Yani;

8 ile 20 karakter arasında olmasını istiyor isek [a-zA-Z0-9]{8,20} yazmamız yeterli olacaktır. Yada en az 8 karakter deyip sonrasında olabildiğince uzun olmasını istiyorsak [a-zA-Z0-9]{8,} şeklinde yazıyoruz. Dikkat ettiyseniz virgülden sonra herhangibirşey yazmadık. Yani sonsuz uzunlukta olabilir. Eğer ki virgül koymadan [a-zA-Z0-9]{8} yazmış olsaydık bu tam olarak 8 karakter olması gerekiyor manasına gelecekti. Özellikle boyut kontrolü yapılan kısımlarda çok işe yarıyor.

Şu ana kadar öğrendiğimiz bilgiler üzerinden bir kaç örnek yapalım.

Ali ve Veli isimlerini aratan Regex sorgusu; (a|ve)li

 

Basit olarak email kontrolü; [a-zA-Z0-9_]+@[A-Za-z0-9]+\.[a-zA-Z]+

Not : Email kontrolü aslında eksik bir örnek. İlerleyen süreçte bunun gelişmiş ve gerçek anlamda her türlü emaili kontrol eden bir sorgu yazacağız. Bununla idare edin şu an için 😉

 

Telefon numarası kontrolü; 0[0-9]{3} [0-9]{3} [0-9]{2} [0-9]{2}

Not: 0224 280 84 71 numarası kontrol ediyor. Arada boşluklar var ve mutlaka 0(sıfır) ile başlaması gerekiyor.

 

Döküman içerisinde ki tarihler; (19[0-9]{2})|(20[0-9]{2})

Not: Bur örnek biraz daha karmaşık. Bu sorguda şartımız 20. ve 21. yüzyıl içerisinde ki tarihleri alıyor. Dikkat ettiyseniz önce ki bilgilerin büyük bir kısmını burada kullandık. İki farklı sorgu yazdık ve arasına or karakteri ile iki tarihten birisi olabilir diye sorgulama yaptırdık.

Şu an için bu kadar yeterli diye düşünüyorum. Bir sonra ki yazıda biraz daha derinlere inip Regex’in asıl gücünün nereden geldiğini ve ne şekilde yönetmeniz gerektiğini görücez. Umarım buraya kadar yazdıklarımın bir faydası olur.

Not: yazı içerisinde Regex sorgusu olan bütün ifadeler altı çizilip ve kalınlaştırılmıştır.

Facebook Comments

Bir Cevap Yazın

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