HELLO, I’M SERHAT AND THIS IS MY FANCY TITLE.

Ruby günlüğü - gün 8

Regular Expressions konusu aslında oldukça detaylı bir konu, ama dilden dile çok fazla fark göstermiyor, örneğin PHP'de ilk iki karakteri kastetmek istediğimizde %.2a (a burada temsili ifade) kullanıyoruz. Ruby'de ise, ^.. kullanıyoruz. Ruby düzenli ifadeler kullanımı konusunda Perl'e çok benziyor ve NFA eşleştirmesini kullanıyor.

Bu düzenli ifadeler nerede işimize yarar, açıkcası bende bir proje üzerinde çalışırken önemini anlamıştım. Bir kullanıcı adı ve şifre girişi düşünün, kullanıcı adı olarak öğrenci numarası kullanılacak ve okulumun öğrenci numaraları 8 haneli. İlk 2 hane okula giriş yılını temsil ediyor, kullanıcı adında bunu kontrol ettirip, öğrenci olmayanların girmesine bir ölçüde engel olmalıyız.

Bu durumda şu kontrollerin yapılması lazım;

  • Kullanıcı adı 8 haneli ve integer olmak zorunda.
  • Sadece 2008'den bugüne olan öğrenciler girsin, yani öğrenci numarasının ilk 2 karakteri 08-09 ve 10 olabilir.

İşte burada tam olarak düzenli ifade kullanarak kontrol ettirdik. Her eve lazım regular expression Tablosu:

ruby-regular-expression

Örnekle başlayayım;

puts "serhat".sub('hat','ser')

Bu örnekte String sınıfının sub metodu ile bir çeşit atama yaptık. Atamadan kasıt değişken atamaları gibi değil, bir string parçasını (aslında onun adı parametre), diğerine atadık. Bu kod "hat" yerine "ser" yazdıracak ve sonuç "serser" olacak.

sub metodu tek bir işlem yapar, yani şöyle bir örnek;

puts "Mustafa Serhat".sub('a', '')

Burada "a" parametresini boş parametreye atadık ve bütün "a" harflerinin boş karakterle değiştirileceğini sanıyoruz, oysa ki çalıştırınca yalnızca ilk "a" karakteri boş karakterle değişecek ve sonuç "Mustfa Serhat" olacak.

Multiple atama işlemi için sub yerine gsub metodunu kullanmalıyız.

puts "Mustafa Serhat".gsub('a', '')

Şimdi sonuç "Mustf Serht" olacak.

"Mustafa Serhat" stringinin ilk dört harfini "böte" olarak değiştirmek istersek, yukarıda bahsettiğim ifadeleri kullanmak gerekir.

puts "Mustafa Serhat".sub(/^..../, 'bote')

Sonuç "boteafa Serhat" olacaktır.

^ karakteri, düzenli ifadenin, çalışmaya stringin başından başlayacağını söyler. Sondan bu işlemi yapmak istersek $ sembolünü kullanmalıyız.

puts "Mustafa Serhat".sub(/....$/, 'bote')

Sonuç "Mustafa Sebote" olacak.

Bu karakterler karmaşık ve hatırda tutması zor karakterler olduğundan, \A ve \Z karakterleri daha elverişlidir.

Aynı örnekler;

puts "Mustafa Serhat".sub(/^..../, 'bote') = puts "Mustafa Serhat".sub(/\A..../, 'bote')
puts "Mustafa Serhat".sub(/....$/, 'bote') = puts "Mustafa Serhat".sub(/....\Z/, 'bote')

Aynı sonuçları verecekler.

Düzenli İfadeler ile String Iteration

Daha önce sayma işlemi için iteratör kullanmıştık, bunu regular expressions ile stringler üzerinde de yapabiliyoruz ;

"Mustafa Serhat".scan(/./) { |x| puts x }

Burada stringin her bir harfini tarattık ve tarama sonuçlarını x'e pass ettik ve ekrana bastırdık. String sınıfının scan metodu, ona verdiğimiz düzenli ifadeye uyan herşeyi x'e yolladı. Sonrada ekrana bastırdık zaten.

Eğer ekrana 2 karakter grubu halinde bastırmak isteseydik? Çok basit, o zaman 2 nokta koyarız. Veya nokta yerine hangi regular expression koyacaksak, ondan iki tane.

"Mustafa Serhat".scan(/../){ |x| puts x }

İlk başta paylaştığım tabloyu kullanarak, string içerisinden integerları çıkartıp ekrana bastıralım;

"Gecen gun 50 litre benzin aldim, inanirmisin 160 TL tuttu".scan(/\d+/) {|x| puts x}
> 50
> 160

Burada ki + sembolü ile, rakamları mümkün olduğu kadar tek satırda bastırmaya çalış dedik. + sembolü kullanmasaydık, bütün rakamlar tek tek ve alt alta bastırılacaktı.

Bu uzun cümledeki sesli harfleri ayıralım:

Gecen gun 50 litre benzin aldim, inanirmisin 160Tl tuttu".scan(/[aeiou]/) {|x| puts x}
> eeuieeiaiiaiiiuu

Bu cümlede yer alan harflerden sadece a'dan g'ye kadar olanları alalım:

"Gecen gun 50 litre benzin aldim, inanirmisin 160Tl tuttu".scan(/[a-g]/) {|x| puts x}
> ecegebeada

Eşleştirme

=~ operatörü eşleştirme görevi yapar. Basit bir örnek;

if "Ben Ruby ogreniyorum" =~ /[aeiou]/
  puts "Sesli harfler var"
else
  puts "Sesli harf yok"
end

Bu ifade eğer karmaşık gelirse, String sınıfının bir metodu olan match'i kullanabilirsiniz. O da şöyle olurdu;

if "Ben Ruby ogreniyorum".match(/[aeiou]/)
  puts "Sesli harfler var"
else
  puts "Sesli harf yok"
end

Başarılar.


Share this post!


Blog Comments powered by Disqus.