Blog
Regular Expressions/Düzenli İfadeler Öğreniyorum
- Ayrıntılar
- Kategori: Bilişim
- 10 Ağustos 2009 tarihinde yayınlandı.
- THEMT tarafından yazıldı.
Konu Başlıkları
- Regular Expressions Nedir?
- Regular Expressions Bunu Nasıl Yapar?
- Aranacak Şeyi Anlamak!
- Kullanım ve Hazırlık
- Regular Expressions İle Çözüm Üretmek!
- Regular Expressions Araçları
- Regular Expressions Kalıpları, Anahtar Kelimeleri ve İşlemleri!
- Ek Özellikler
- Regular Expressions İle Bul ve Değiştir İşlemi!
- Hazır Kalıplar
- 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
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!
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ğı
Bunun sebebini listelersek eğer
- Boşluk karakteri yerine _ karakteri vardır
- Boşluk karakteri yerinde olan _ karakteri birden fazla vardır (Çok sayıda boşluk vardır)
- Tamirci Çırağı şeklinde olması gerekiyorken, Tamirci kelimesi yoktur
- Çı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 |
|
. (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. |
|
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 |
|
Var |
[...] (Square brackets/Köşeli parantez) | [İfadeler] | İşlem içinde bulunan ifadelerden sıra önemi olmadan uyan birinin olabilme olasılığını vurgular |
|
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. |
|
Yok |
Ek Özellikler
(...) (Brackets/Parantez) Ek Özellikleri
|
[...] (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 |
|
- (Hyphen/Tire) | [karakter1-karakter2] | İki yanında bulunan karakterlerin arasındaki karakterleri de varsayar! |
|
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