Login

Blog

Regular Expressions/Düzenli İfadeler Öğreniyorum

Regular Expressions/Düzenli İfadeler Öğreniyorum

Konu Başlıkları

  1. Regular Expressions Nedir?
  2. Regular Expressions Bunu Nasıl Yapar?
  3. Aranacak Şeyi Anlamak!
  4. Kullanım ve Hazırlık
  5. Regular Expressions İle Çözüm Üretmek!
  6. Regular Expressions Araçları
    1. MT's RegExp HTA App
    2. Notepad++
    3. Powerful GREP
  7. Regular Expressions Kalıpları, Anahtar Kelimeleri ve İşlemleri!
    1. ÖnTanımlı Kalıplar
    2. Anahtar Karakterler
    3. Anahtar İşlemler
  8. Ek Özellikler
    1. (...) (Brackets/Parantez) Ek Özellikleri
    2. [...] (Square brackets/Köşeli parantez) Ek Özellikleri
  9. Regular Expressions İle Bul ve Değiştir İşlemi!
  10. Hazır Kalıplar
  11. Son!

Regular Expressions Nedir?

Kısaca bir arama ve gerekirse arama/değiştirme tekniğidir! Arama işlemini güçlü kılmak için, arama sözcüğü içine özel ifadeler eklenir. Bu ifadelerin eklenmesi belirli bir düzenle yapılır! İçinde ifadeler olan yeni arama metnine, Regular Expressions kalıbı adı verilir! Bu teknoloji adını, kalıp oluşturmak için düzenli olarak ifade ekleme işleminden alır! Bazı yerlerde kısa adı ile, yani RegExp kullanılır

Bir şey bulmak istediğinizde anda ilk yaptığınız bulmak istediğinizin adını girmek olur! Peki girdiğiniz ad, bulmak istediğiniz şey ile uyuşmuyorsa? Bu durumda aradığınızı bulamayacaksınız! Peki ne yapacaksınız? Arama metnini, bulmak istediğinize daha yaklaştırıp tekrar bir arama işlemi başlatırsınız! Yine bulamazsanız aradığınız istediğiniz şeyin adından emin olmadığınızı anlarsınız!

İşte tam bu noktada yardımınıza Regular Expressions/Düzenli İfadeler yetişir! Sürekli gelişen bir teknoloji olduğundan, yazımdan sonra daha fazla özelliğe sahip olmuş olabilir! Bunu göz ardı etmeyiniz, elimden geldiği kadar yenilikleri eklemeye çalışacam

Regular Expressions Bunu Nasıl Yapar?

Bildiğiniz ya da bilemediğiniz karakterin, sözcüğün ya da işlemin yerini alır ve aşağıdaki listede bulunan seçenekleri irdeler

  • Onun tekrar sayısına önem verir
  • Alternatiflerini hesaba katar
  • Olabilirliğini varsayar
  • Tekrarının olabileceğini düşünür
  • Yazım şekline dikkat eder
  • Olmaması gerektiğine önem verir!
Bu işlemlerin tümünü bir kerede yapabilir!

Aranacak Şeyi Anlamak!

Aradığınız Cem Karaca'nın (Allah rahmet eylesin!) Tamirci Çırağı şarkısı olsun. Normal şartlarda aşağıdaki şekillerde arama yapabiliriz.
  • Cem Karaca
  • Tamirci Çırağı
  • Cem Karaca Tamirci Çırağı
  • Cem Karaca - Tamirci Çırağı
Bu seçeneklerden biri ya da birkaçı bulmak istediğiniz müziğe ulaşmanızı sağlayabilir! Hatta alakasız bir çok şey bulabilirsiniz! Ya da hiç birşey bulamayabilirsiniz! Bulamamanız halinde kendiniz araştırarak bulmaya kalkışırsınız ve görürsünüz ki, bulmak istediğiniz müzik parçasının adı Cem_Karaca_-___Çıragı.mp3 şeklindedir! Doğal olarak seçeneklerden hiç biri müzik parçasının adı ile uyuşmamaktadır.

Bunun sebebini listelersek eğer

  1. Boşluk karakteri yerine _ karakteri vardır
  2. Boşluk karakteri yerinde olan _ karakteri birden fazla vardır (Çok sayıda boşluk vardır)
  3. Tamirci Çırağı şeklinde olması gerekiyorken, Tamirci kelimesi yoktur
  4. Çırağı olması gerekiyorken, ğ karakteri yerine g vardır

Kullanım ve Hazırlık

Kalıbı oluşturmak için; Ön Tanımlı Kalıplar, Anahtar Karakterler, İşlemler, Ek özellikler ve arama metni sözcükleri kullanılır. Arama işlemini aşağıdaki şekillerde yapabilirsiniz.

  • Bir metin düzenleyici kullanarak yapabilirsiniz. Aramanın Regular Expressions şeklinde yapılacağını belirtir ve arama kısmına kalıbı girersiniz.
  • Programlama dili üzerinde yapabilirsiniz, dilin sunduğu şekilde bir nesne üretir ya da fonksiyon/metod kullanıp, kalıbı /.../ içerisinde tutarak başlatırsınız.

Regular Expressions İle Çözüm Üretmek!

Listelediğim bulamama sebepleri teker teker Regular Expressions ile çözelim!

İlk seçenek için birşeyler yapalım ve boşluk karakteri yerine _ karakterinin de olabileceğini varsayalım.

Çözüm: Boşluk karakterleri anlamına gelen \s kalıbını kullanabilir ya da onun yerine bir boşluk da bırabiliriz. Daha sonra diğer olasığı yazabilmemiz için | (pipe/kamış) anahtar karakterini yazarız, son olarak _ karakterini yazıp işlemi bitiririz! Bu işlemi parantez içine aldık. Bunun sebebi, işlemin yanında bulunan diğer sözcüklerden ayırmak, onlardan soyutlayıp, etrafındakileri işleme dahil etmemek içindir! Tüm olasılıklar | anahtar karakteri ile ayırmalısınız yoksa bütün bir sözcük gibi olacaktır.

(abcd) Böyle yaparsak, aslında 'abcd' sözcüğünü ararız! Ama (a|b|c|d) yapacak olursak, harflerden bir tanesini ararız.

Sonuç:

Cem(\s|_)Karaca

İkinci seçenek için _ karakterinin birden fazla olabileceğini varsayalım

Çözüm: * (star/yıldız) anahtar kelimesini kullanırız. Bu anahtar karakter, kendinden önce gelen sözcüğün ya da işlemin, çok sayıda tekrar edebileceğini vurguladığı gibi, hiç olmayabileceğini de hesaba katar!

Araba(m)* yaparsak, Araba sözcüğünden sonra m olmayacağı gibi, olma halinde mmmmmm.... şekilde olabileceğini vurguladık

Sonuç:

Cem(\s|_)*Karaca

Üçüncü seçenek için Tamirci kelimesinin 1 tane olabileceğini varsayalım

Çözüm: ? (Question mark/Soru işareti) anahtar karakterini kullanırız! Bu anahtar karakter, kendinden önce gelen sözcüğün ya da işlemin, olmayabileceğini, olursa da en fazla bir kez olacağını hesaba katar!

Blue? Jean yaparsak, Blue sözcüğünün bir kez olabileceğini ya da hiç olmayacağını vurgularız

Sonuç:

Cem(\s|_)*Karaca(\s|_)*-(\s|_)*(Tamirci)?

Son seçenek için ğ karakteri ve g de olabileceğini varsayalım

Çözüm: [...] köşeli parantez içinde sıraları önemli olmadan tüm olasılıkları yan yana yazarız! Bu işlemde yan yana yazılan karakter ya da işlemlerden bir tanesinin olabileceğini hesaba katar! Bu işlem, (a|b) işlemi ile aynı olmakla beraber, daha fazla yeteneği olmaktadır! Bunları ileriki başlıklar altında bulabilirsiniz.

[(Kırmızı)(Mavi)(Turuncu)] Top yaparsak, Top sözcüğünden önce Kırmızı, Mavi ya da Turuncu sözcüğünden birinin mutlaka olabileceğini vurgularız

Sonuç:

Cem(\s|_)*Karaca(\s|_)*-(\s|_)*(Tamirci)?Çıra[gğ]

Son olarak arama metnimiz aşağıdaki şekilde olacaktır.

Cem(\s|_)*Karaca(\s|_)*-(\s|_)*(Tamirci)?Çıra[gğ]ı

Regular Expressions Araçları

Bazı araçlarda Regular Expressions/Düzenli ifadeler özelliklerinden birinin ya da birkaçının desteklemeyebileceğini unutmayınız! Desteklenmemesi halinde, arama metniniz doğru olması halinde, sonuca ulaşamayacaksınız!

MT's RegExp HTA App VBScript dili kullanarak HTA platformu üzerinde geliştirdiğim ücretsiz bir araçtır! VBScriptin elverdiği kadar Regular Expressions/Düzenli İfadeler özelliklerini destekler. Türkçe ve İngilizce dil desteği ve çok sayıda özellikleri mevcuttur

Sitesi için tıklayın!
1.0.0 sürümünü indirmek için tıklayın!

Notepad++ Gelişmiş bir metin editörüdür. Açık kaynaklı ve ücretsizdir. Regular Expressions/Düzenli İfadeler özelliklerinin bazılarını desteklemediğini düşünüyorum. Türkçe ve bir çok dil desteği ve çok sayıda özelliği mevcuttur.

Sitesi için tıklayın!
5.4.5 sürümünü indirmek için tıklayın!

Powerful GREP Gelişmiş bir metin editörü ve toplu dosya işlemcisidir. Deneme sürümü vardır ve ücretlidir. Regular Expressions/Düzenli İfadeler özelliklerinin tümünü destekler. Şuan için sadece ingilizce dil desteği ve çok sayıda özelliği mevcuttur.

Sitesi için tıklayın!
3.5.2 sürümünü indirmek için tıklayın!

Regular Expressions Kalıpları, Anahtar Kelimeleri ve İşlemleri!

ÖnTanımlı Kalıplar

\d bir rakamı ifade eder
\D bir rakam olmaması halini ifade eder

Not! Görüldüğü gibi aynı kalıbın büyük hali bazı durumlarda tersini ifade etmektedir!

\s boşluk ve ya sekme (tab) karakterini ifade eder (tersi vardır)
\w bir harfi ve de rakamı ifade eder (tersi vardır)
\n yeni satırı ifade eder (tersi vardır)
\b backspace/geriboşluğu ifade eder (tersi vardır)
\t tab/sekme boşluğunu ifade eder (tersi vardır)
\v düşey tab/sekmeyi ifade eder (tersi vardır)
\r geridönüşü ifade eder (tersi vardır)
\0 boş metin ya da metin sonunu ifade eder
\xhh iki haneli hexadecimal/ondalık karakteri ifade eder! hhhh olabilirdi bu durumda dört haneli olacaktır
\uhh iki haneli hexadecimal/onaltılık karakteri ifade eder! hhhh olabilirdi bu durumda dört haneli olacaktır

Anahtar Karakterler

Karakter Kullanımı Açıklaması Örnek
* (star/yıldız) sözcük/işlem* Kendinden önceki ifadenin hiç olmamasını ya da tekrarı olduğunu vurgular Benden çok olabilir*
? (Question mark/Soru işareti) sözcük/işlem? Kendinden önceki ifadenin olduğunu ya da olmadığını vurgular Benden bir tane olabilir?
+ (Plus/Artı) sözcük/işlem+ Kendinden önceki ifadenin en az bir ya da tekrarının olduğunu vurgular Benden çok olmalıdır+
| (Pipe/Kamış) ifade1|ifade2|ifadeN İfadeleri ayırı ve yanlarında bulunan ifadelerden birinin mutlaka olduğunu vurgular
  • Evet|Hayır
  • a|b|c
  • 1|2|3
. (Dot/Nokta) . Herhangi bir tek karakter olduğunu vurgular! Tekrar açarsam bilinmeyen bir karakter yerine geçer . Herşey olabilirim
^ (Caret/Açı) ^ifadeler Kendinden sonra gelen ifadelerin satır başında olduğunu vurgular! Tekrar açarsam ifadeler yeni bir satırda bulunmalıdır ^Bir varmış bir yokmuş...
$ (Dollar/Dolar) ifadeler$ Kendinden önce gelen ifadelerin satır sonunda olduğunu vurgular! Tekrar açarsam ifadeler sonrasında satır bitmelidir ...ve masal böylece biter$
\ (Backslash/Ters Eğik) \karakter Kendinden sonra gelen karakterin bir önemi olduğunu vurgular! Tekrar açarsam kendinden sonra gelen kalıp olabilir ya da özel karakter kullanılmasına izin verir! Normal şartlarda $, ^ ve | gibi karakterler anahtar karakterdir ve vazifeleri vardır! Bu durumun önüne geçmek için kullanılır.
  • \d
  • \s
  • \\ \ vazifesi yoktur
  • \$ $ vazifesi yoktur

Anahtar İşlemler

Karakter Kullanımı Açıklaması Örnek Ek Özellik
(...) (Brackets/Parantez) (İfadeler) İşlem içinde bulunan ifadeleri, yan ifadelerden soyutlar! Tekrar açarsam diğer ifadelerden ayırır, eğer içinde işlem varsa yanlarındaki ifadelere uygulamaz

Ayrıca içindeki ifade bulunması halinde bulunanu hafızaya alır! Bu işlem Bul ve Değiştir durumunda kullanılır
  1. Araba(m*)
  2. Araba(m)*
Var
[...] (Square brackets/Köşeli parantez) [İfadeler] İşlem içinde bulunan ifadelerden sıra önemi olmadan uyan birinin olabilme olasılığını vurgular
  • [(Kırmızı)(Mavi)(Turuncu)]
  • [abc]
  • [123]
Var
{sayı 1,sayı 2} ifade{en az, en çok} Kendinden önce gelen ifadenin, belirli sayıdaki tekrarını vurgular! Ayrıca ifade{4} şeklinde olduğu gibi en çok sayısı belirtilmeden ya da ifade{,4} şekilde olduğu gibi en az sayısı belirtilmeden kullanılabilir.
  • Benden, en az 1, en fazla 3 tekrar var{1,3}
  • Benden 3 tekrar var{3}
  • Benden, en az 1 tekrar var{1,}
Yok


Ek Özellikler

(...) (Brackets/Parantez) Ek Özellikleri

Karakter Kullanımı Açıklaması Örnek
(?=...) (?=İfadeler) Kendinden önceki parantez dışındaki ifadelerin devamında, parantez içindeki ifadelerin olduğunu varsayar ben varım(?=Ben de varım)
(?!...) (?!İfadeler) Kendinden önceki parantez dışındaki ifadelerin devamında, parantez içindeki ifadelerin olmadığını varsayar ben varım(?!Ama ben yokum)
(?:...) (?:İfadeler) Parantez içindeki ifadelerin bulunması durumunda, bulunanı hafızaya almaz! (?:Beni hafızaya alma)

[...] (Square brackets/Köşeli parantez) Ek Özellikleri

Karakter Kullanımı Açıklaması Örnek
[^...] (Caret/Açı) [^İfadeler] İçinde bulunan ifadelerin olmaması gerektiğini vurgular! Tekrar açarsam yapmakta olduğu işin tersini yapar
  • [^(Kırmızı)(Mavi)(Turuncu)]
  • [^abc]
  • [^123]
- (Hyphen/Tire) [karakter1-karakter2] İki yanında bulunan karakterlerin arasındaki karakterleri de varsayar!
  • [a-c] ya da [A-Z]
  • [1-3] ya da [0-9]


Regular Expressions İle Bul ve Değiştir İşlemi!

Bu tekniğin bir diğer gücü ise, bulduğunuz üzerinde değiştirme işlemi yaptığınızda ortaya çıkar! Değişiklik yaparken, bulduğunuz sözcükleri değiştirme işlemi içine katmak istediğiniz durumlar olur, işte tam burada Regular Expressions yarımınıza bir kez daha yetişir! (Gördüğünüz gibi kızılay gibi bir teknolojidir bu :D Kızılay demişken bu güzel kuruma yaptığınız yardımları esirgemeyin!)

Kullanım

Arama sözcüğü içinde Anahtar İşlemler başlığı altında gördüğünüz (ifade) (Brackets/Parantez) kullanılmalıdır ilk olarak! Bu durumda eşleşme/bulunma gerçekleştiğinde bu hafızaya alınacaktır! Parantez anahtar işleminin ayrıca soyutlama özelliği olduğu için bazen hafızaya almasını istemeye bilirsiniz, bu durumda (?:ifade) şeklini kullanmalısınız!

Hafızadaki bulunan sözcüğü değiştirme satırında kullanmak için özel bir ifade kullanmanız gerekir, bu özel ifade bazen \sayı, bazen $sayı şeklinde olabilir. Bu durum kullandığın araca göre değişir! Ama gördüğünüz gibi her zaman ifade içinde bir sayı vardır. Bu sayı arama sözcüğü içinde kullandığınız (ifade) (Brackets/Parantez) soldan sağa doğru olan konumudur!

Örnek

Metin: ...Kırmızı Başlıklı Kız ormanda babanesinin evine giderken....
Arama metni: (?:Kırmızı) (\w*) (Kız) (Masalı)
Değişim sözcüğü: Nükleer \1 \2

(?:Kırmızı) Boşluk (\w*) Boşluk (Kız) Boşluk (Masalı)
\1 = Tanımsız!
Kırmızı sözcüğü aranıyor
Hafızaya alma işlemi yapılmadı
\1 = Başlıklı
Harflerin tekrar ettiği sözcük aranıyor
\2 = Kız
Kız sözcüğü aranıyor
\3 = Bulunamadı/Boş
Masalı sözcüğü aranıyor

Değişim sonucu: Nükleer Başlıklı Kız


Hazır Kalıplar

  • Kendi ihtiyaçlarım için ürettiğim bazı kalıpları, kendi sayfamda bulabilirsiniz. Gitmek için tıklayın!
  • Kalıp paylaşımının yapıldığı Regular Expression Library isimli sitede bulabilirsiniz. Gitmek için tıklayın!

Son!

Artık siz de Regular Expressions/Düzenli İfadeler bilenler ve kullananlar kervanına katılanlardansınız! Kullandıkça bir çok işinizi çabucak hallettiğinizi ve bu teknolojiye ait daha çok şey anlayacağınızı garanti ederim!

Bu yazının tüm hakları Murat TAMCI'ya aittir! Yazarı belirtiğiniz ve bu sayfa referans bir bağlantı kullandığınız sürece orada burada kullanabilirsiniz! Aksi halde "fincanı oydum içine bağdem koydum" sözcüğünü uygulayabilirim! :D - 10.08.2009