Celil Uyanikoglu

Regex Rehberi: Düzenli İfadeler Kapsamlı Kılavuz

Celil Uyanikoglu Celil Uyanikoglu · 31 Mar 2026 · 6 dk okuma
Programlama dünyasında metin işleme kaçınılmaz bir gereklilik. E-posta adresi doğrulama, telefon numarası kontrolü, log dosyası analizi... Tüm bu işlemlerin ortak noktası regex (düzenli ifadeler). İlk bakışta kriptik görünen bu sözdizimi, bir kez öğrenildiğinde metin işleme problemlerini saniyeler içinde çözebilir. Regex Nedir? Regex, "Regular Expression" (Düzenli İfade) kelimelerinin kısaltması. Metinler içinde belirli desenleri arama, eşleştirme ve değiştirme işlemlerini yapmanın güçlü bir yolu. 1950'lerde matematikçi Stephen Kleene tarafından geliştirilen bu kavram, bugün neredeyse tüm programlama dillerinde standart bir araç haline geldi. Basit bir örnekle açıklayalım: Bir metin dosyasında tüm e-posta adreslerini bulmak istiyorsunuz. Manuel olarak binlerce satırı taramak yerine, tek bir regex deseni tüm e-postaları saniyeler içinde bulabilir. Neden Regex Öğrenmeliyiz? Regex bilmeden de programlama yapılabilir ama büyük bir avantajı kaçırmış olursunuz. İşte regex'in vazgeçilmez olduğu durumlar: Form doğrulama: Kullanıcının girdiği e-posta, telefon, tarih formatlarının kontrolü. Metin arama ve değiştirme: Kod editörlerinde veya IDE'lerde karmaşık arama işlemleri. Log analizi: Sunucu loglarından belirli bilgileri çıkarma. Veri temizleme: Düzensiz verileri standart formata dönüştürme. Web scraping: HTML içinden belirli verileri ayıklama. Regex hemen hemen her programlama dilinde desteklenir. Python, JavaScript, Java, C#, PHP, Ruby, Go, Perl... Bir kez öğrendiğinizde bu bilgiyi her yerde kullanabilirsiniz. Temel Sözdizimi Regex öğrenmenin ilk adımı meta karakterleri tanımak. Bu özel karakterler, desenin nasıl eşleşeceğini belirler. Basit Karakterler Normal harfler ve rakamlar kendileriyle eşleşir. "hello" deseni metinde "hello" kelimesini bulur. Büyük-küçük harf duyarlılığı varsayılan olarak aktiftir, yani "Hello" eşleşmez. Nokta (.) - Joker Karakter Nokta, herhangi bir tek karakterle eşleşir (satır sonu hariç). ".ook" deseni book, cook, look, took ile eşleşir. "a.b" deseni a1b, a-b, axb ile eşleşir ama ab veya axxb ile eşleşmez. Dikkat: Nokta sadece tek bir karakter yerine geçer. Başlangıç ve Bitiş (^ ve $) Düzeltme işareti (^) satır başını, dolar işareti ($) satır sonunu ifade eder. "^Merhaba" deseni sadece satır başındaki "Merhaba" ile eşleşir. "dünya$" deseni sadece satır sonundaki "dünya" ile eşleşir. "^Merhaba Dünya$" deseni tam olarak "Merhaba Dünya" yazan satırları bulur. Karakter Sınıfları ([ ]) Köşeli parantezler içinde belirtilen karakterlerden herhangi biriyle eşleşme sağlar. "[abc]" deseni a, b veya c ile eşleşir. "b[aeo]l" deseni bal, bel veya bol ile eşleşir. "[0-9]" deseni herhangi bir rakamla eşleşir. "[a-z]" deseni herhangi bir küçük harfle eşleşir. "[A-Za-z]" deseni herhangi bir harfle eşleşir. Ters karakter sınıfı için şapka kullanılır: "[^0-9]" deseni rakam olmayan herhangi bir karakterle eşleşir. Önceden Tanımlı Karakter Sınıfları Sık kullanılan sınıflar için kısayollar mevcuttur: \d herhangi bir rakamla eşleşir, [0-9] ile aynı. \D rakam olmayan karakterle eşleşir, [^0-9] ile aynı. \w kelime karakteriyle eşleşir (harf, rakam, alt çizgi), [a-zA-Z0-9_] ile aynı. \W kelime karakteri olmayan ile eşleşir. \s boşluk karakteriyle eşleşir (boşluk, tab, satır sonu). \S boşluk olmayan karakterle eşleşir. Niceleyiciler (Quantifiers) Bir karakterin veya grubun kaç kez tekrarlanacağını belirtir: Yıldız () sıfır veya daha fazla tekrar anlamına gelir. "abc" deseni ac, abc, abbc, abbbc ile eşleşir. Artı (+) bir veya daha fazla tekrar anlamına gelir. "ab+c" deseni abc, abbc ile eşleşir ama ac ile eşleşmez. Soru işareti (?) sıfır veya bir tekrar anlamına gelir (opsiyonel). "colou?r" deseni hem color hem colour ile eşleşir. Süslü parantezler ({n,m}) belirli sayıda tekrar için kullanılır. {3} tam olarak 3 kez, {2,4} 2 ile 4 arasında, {3,} en az 3 kez anlamına gelir. Açgözlü ve Tembel Eşleşme Varsayılan olarak niceleyiciler açgözlüdür (greedy), yani mümkün olan en fazla karakteri eşleştirmeye çalışır. Örnek: "<.*>" deseni "
içerik
" metninde tamamını eşleştirir, sadece "
" kısmını değil. Çünkü yıldız, son > karakterine kadar her şeyi alır. Tembel (non-greedy) eşleşme için niceleyicinin ardına soru işareti eklenir. "<.*?>" deseni sadece "
" ile eşleşir. Gruplar ve Alternatifler Parantezler gruplama için kullanılır. Grupların iki ana işlevi vardır: deseni organize etmek ve eşleşen kısmı yakalamak. Yakalama Grupları "(ab)+" deseni ab, abab, ababab ile eşleşir. Parantez içindeki kısım yakalanır ve sonradan kullanılabilir. Geri referanslar yakalanan grupları tekrar kullanmayı sağlar. "(\w+)\s+\1" deseni tekrar eden kelimeleri bulur. \1 ifadesi birinci yakalama grubunu referans alır. Yakalamayan Gruplar Bazen sadece gruplama gerekir, yakalama gerekmez. "(?:ab)+" deseni gruplama yapar ama yakalamaz. Bu performans açısından daha verimlidir. Alternatifler (|) Pipe karakteri VEYA anlamına gelir. "kedi|köpek" deseni kedi veya köpek ile eşleşir. "(pazartesi|salı|çarşamba)" deseni bu üç günden biriyle eşleşir. İleri Düzey: Lookaround Lookaround (bakınma) ifadeleri, karakterleri tüketmeden koşullu eşleşme sağlar. Dört türü vardır: Pozitif İleri Bakış (Positive Lookahead) "X(?=Y)" sözdizimi: X'i bul, ama sadece Y takip ediyorsa. "\d+(?=€)" deseni 30€ içindeki 30 ile eşleşir. Euro işareti kontrol edilir ama eşleşmeye dahil edilmez. Negatif İleri Bakış (Negative Lookahead) "X(?!Y)" sözdizimi: X'i bul, ama Y takip etmiyorsa. "q(?!u)" deseni "Iraq" içindeki q ile eşleşir ama "queen" içindeki q ile eşleşmez. İngilizce'de q harfinden sonra genellikle u gelir, bu desen istisnai durumları bulur. Pozitif Geri Bakış (Positive Lookbehind) "(?<=Y)X" sözdizimi: X'i bul, ama sadece Y öncesinde geliyorsa. "(?<=\$)\d+" deseni $100 içindeki 100 ile eşleşir. Dolar işareti kontrol edilir ama eşleşmeye dahil edilmez. Negatif Geri Bakış (Negative Lookbehind) "(?[a-z])(?=.[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$ Bu desen lookahead kullanır: (?=.[a-z]) en az bir küçük harf, (?=.[A-Z]) en az bir büyük harf, (?=.*\d) en az bir rakam, [a-zA-Z\d]{8,} toplam en az 8 karakter. Programlama Dillerinde Regex Her dilin regex kullanımı biraz farklıdır. İşte yaygın dillerde örnekler: JavaScript const metin = "E-posta: [email protected]"; const desen = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/; const sonuc = metin.match(desen); JavaScript'te regex desenleri / / arasına yazılır. Bayraklar: g (global, tüm eşleşmeler), i (büyük-küçük harf duyarsız), m (çok satırlı). Python import re metin = "E-posta: [email protected]" desen = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" sonuc = re.search(desen, metin) Python'da r öneki raw string oluşturur, ters slash sorunlarını önler. PHP $metin = "E-posta: [email protected]"; $desen = "/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/"; preg_match($desen, $metin, $sonuc); PHP'de preg_match, preg_match_all, preg_replace fonksiyonları kullanılır. Test Araçları Regex yazmak zor olabilir. Neyse ki yardımcı araçlar var: regex101.com en popüler test aracı. Deseni ve metni girdiğinizde eşleşmeleri gösterir, deseni açıklar ve farklı dil seçenekleri sunar. regexr.com interaktif öğrenme ortamı sunar. debuggex.com görsel regex açıklaması sağlar. Bu araçları kullanarak desenlerinizi gerçek veriler üzerinde test edin. Yaygın Hatalar ve İpuçları Özel karakterleri escape etmeyi unutmak sık yapılan bir hatadır. Nokta, köşeli parantez, parantez gibi karakterler özel anlam taşır. Literal olarak kullanmak için \ ile escape edin. Aşırı karmaşık desenler yazmaktan kaçının. Uzun ve anlaşılmaz regex'ler bakımı zorlaştırır. Gerekirse birden fazla basit desene bölün. Performansa dikkat edin. Yanlış yapılandırılmış desenler "catastrophic backtracking" sorunu yaratabilir. Özellikle iç içe niceleyicilerden kaçının: (a+)+ gibi. Satır sonu karakterlerini unutmayın. Farklı işletim sistemleri farklı satır sonu karakterleri kullanır (Windows: \r\n, Unix: \n). Bunu göz önünde bulundurun. Sonuç Regex, metin işleme problemlerini çözmek için güçlü bir araç. İlk bakışta karmaşık görünse de temel yapı taşlarını öğrendikten sonra mantığı oturur. Öğrenme stratejisi olarak basit desenlerle başlayın. Meta karakterleri tek tek öğrenin. regex101.com gibi araçlarla pratik yapın. Gerçek problemler üzerinde çalışın. Regex her programcının araç kutusunda bulunması gereken bir beceri. E-posta doğrulamadan log analizine, kod refactoring'den veri temizlemeye kadar sayısız alanda işinize yarayacak. Tek seferlik bir öğrenme yatırımıyla, yıllar boyunca zaman kazanacaksınız.

0 Yorum

Yorum Yaz