Regex Rehberi: Düzenli İfadeleri Örneklerle Öğrenmek

Karakter sınıfları, niceleyiciler ve gruplarla regex'i sıfırdan öğrenmenizi sağlayan, gerçek doğrulama ve arama örnekleri içeren pratik bir başlangıç kılavuzu.

Programlar
Regex Rehberi: Düzenli İfadeleri Örneklerle Öğrenmek

Bir e-posta adresinin doğru formatta olup olmadığını kontrol etmek, bir log dosyasından IP adreslerini ayıklamak, bir metindeki tüm tarihleri bulmak: üç farklı problemin ortak çözümü aynı. Düzenli ifadeler, yani regex, ilk bakışta anlaşılmaz bir sembol yığını gibi görünür; birkaç yapı taşını öğrendikten sonra günlük iş akışına gerçekten oturan bir araca dönüşür.

Regex Nedir, Neden Öğrenmeye Değer

Regex, metin içinde belirli bir kalıbı tanımlayan özel bir karakter dizisidir. Bu kalıp tek bir kelime kadar dar ya da karmaşık bir yapı kadar esnek olabilir; arama, doğrulama, çıkarma ve değiştirme işlemlerinin hepsi aynı sözdizimiyle çalışır.

Regex'in değeri, hemen her programlama dilinde, metin editöründe ve komut satırı aracında desteklenmesinden gelir. MDN Web Docs'taki JavaScript regex dokümantasyonu bu sözdizimini kapsamlı biçimde ele alır; bir dilde öğrenilen mantık, küçük sözdizimi farklarıyla başka bir dilde de işe yarar. Regex'i öğrenmeye değer kılan asıl sebep de bu: bir kere oturttuğunuzda taşınabilir bir beceri kazanırsınız.

Regex olmadan aynı işi yapmak genelde onlarca satırlık döngü ve koşul gerektirir; regex ile bu iş çoğu zaman tek satıra iner. Öğrenme eğrisi başlangıçta dik, ama bir hafta düzenli pratikle temel desenleri okuyup yazabilir hale gelirsiniz.

Temel Sözdizimi: Karakterler, Sınıflar, Çapalar

Düz karakterler en basit yapı taşıdır; kedi deseni metinde tam olarak "kedi" kelimesini arar. Asıl güç metakarakterlerdedir: nokta (.) herhangi bir karakteri temsil eder, yıldız (*) önceki öğenin sıfır veya daha fazla tekrarını, artı (+) ise bir veya daha fazla tekrarını ifade eder.

Basit bir e-posta doğrulama regex deseninin yazılı olduğu kod penceresi

Karakter sınıfları köşeli parantezle tanımlanır:

[abc]      → a, b veya c'den biri
[0-9]      → herhangi bir rakam
[a-zA-Z]   → herhangi bir harf (büyük/küçük)
[^0-9]     → rakam OLMAYAN herhangi bir karakter

Çapalar, eşleşmenin metindeki konumunu belirler: ^ satır başını, $ satır sonunu işaret eder. Basit bir e-posta doğrulama deseni şöyle görünebilir:

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

Bu desen, kullanıcı adı kısmında harf-rakam-nokta-alt çizgi kombinasyonuna, ardından @, sonra alan adı ve en az iki harfli bir uzantıya izin verir. Gerçek dünyada e-posta doğrulaması için tam RFC uyumlu bir regex çok daha karmaşıktır; pratikte bu basitleştirilmiş hâli çoğu form için yeterlidir.

Kaçış karakteri de bu noktada devreye girer. Nokta işareti normalde "herhangi bir karakter" anlamına geldiği için, gerçek bir nokta aramak istediğinizde önüne ters eğik çizgi koyup \. yazmanız gerekir; bu ayrımı gözden kaçırmak, yukarıdaki e-posta deseninde alan adı kısmının yanlışlıkla her karakteri kabul etmesine yol açar.

Pratik Kullanım: Doğrulama, Arama, Değiştirme

Veri doğrulama, regex'in en yaygın kullanım alanıdır. Bir kayıt formunda telefon numarasının doğru formatta girildiğini kontrol etmek için basit bir desen yeterlidir:

^0[0-9]{3}[0-9]{3}[0-9]{2}[0-9]{2}$

Log dosyalarından bilgi çıkarmak da sık karşılaşılan bir senaryodur; büyük bir sunucu günlüğünde binlerce satır arasından belirli bir hata türünü ayıklamak, regex olmadan neredeyse imkansız bir iştir. Bir sunucu log satırından IP adresi çekmek için:

\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b

Metin değiştirme tarafında, çoğu editör bul-değiştir kutusunda regex desteği sunar. Örneğin bir CSV dosyasındaki tarih formatını GG/AA/YYYY yerine YYYY-AA-GG yapmak için, yakalama gruplarıyla birlikte bir değiştirme deseni yazabilirsiniz; bu, elle yüzlerce satırı düzeltmekten çok daha hızlı sonuç verir.

Bul:     (\d{2})/(\d{2})/(\d{4})
Değiştir: $3-$2-$1

Bu desende parantez içindeki üç grup sırasıyla gün, ay ve yıl olarak yakalanır; değiştirme kısmındaki $1, $2, $3 bu gruplara referans verir. Aynı mantık, log dosyalarını yeniden biçimlendirmekten kod tabanında değişken adlarını toplu değiştirmeye kadar geniş bir yelpazede işe yarar.

Niceleyiciler, Gruplar ve Açgözlü Davranış

Niceleyiciler bir kalıbın kaç kez tekrarlanacağını belirtir: * sıfır veya daha fazla, + bir veya daha fazla, ? sıfır veya bir kez. Süslü parantezle kesin tekrar sayısı da verilebilir: {2,5} iki ile beş kez arası anlamına gelir.

Tarih formatını değiştiren yakalama gruplu bir regex bul-değiştir deseninin yazılı olduğu kod penceresi

Varsayılan davranış açgözlüdür (greedy); niceleyici mümkün olan en uzun eşleşmeyi bulmaya çalışır. <.+> deseni bir HTML satırında ilk < ile son > arasındaki her şeyi yutar, oysa siz muhtemelen her etiketi ayrı ayrı istersiniz. Niceleyiciyi isteksiz (lazy) yapmak için soru işareti eklenir: <.+?> artık en kısa eşleşmeyi bulur.

Gruplar parantezle tanımlanır ve iki temel işe yarar: bir alt deseni yakalamak (capturing group) ya da birden fazla karaktere aynı niceleyiciyi uygulamak. (ab)+ deseni "ab", "abab", "ababab" gibi tekrarları yakalarken, yakalama grubu eşleşen kısmı ayrıca değişkene almanızı sağlar. Yakalamayan gruplar (?:...) sözdizimiyle yazılır ve yalnızca gruplama amaçlı kullanıldığında belleği gereksiz yere doldurmaz.

Alternatif operatörü (|) gruplarla birleştiğinde esneklik daha da artar; (kedi|köpek|kuş) deseni bu üç kelimeden herhangi birini eşleştirir. Uzun bir liste yerine tek bir grup içine sıkıştırmak, deseni hem kısaltır hem okunmasını kolaylaştırır.

Test Araçları ve Sık Yapılan Hatalar

Regex yazarken deneme yanılma kaçınılmazdır; bir deseni kafanızda çalıştırmak yerine çevrimiçi bir regex test aracında (regex101 gibi) anlık geri bildirim almak, öğrenmeyi büyük ölçüde hızlandırır. Bu araçlar hangi kısmın neye eşleştiğini renkli olarak gösterir, hatalı bir kaçış karakterini anında fark etmenizi sağlar.

Çevrimiçi bir regex test aracında desenin eşleşen kısımlarının renkli vurgulandığı arayüz taslağı

En sık yapılan hatalardan biri, metakarakterleri kaçırmamaktır. Bir nokta işaretini gerçek nokta olarak aramak istiyorsanız \. yazmanız gerekir; aksi halde nokta "herhangi bir karakter" anlamına geldiği için desen beklenmedik şeyleri de eşleştirir. Bir başka yaygın hata, aşırı karmaşık tek bir desen yazmaya çalışmaktır; bazen aynı işi iki basit adımda yapmak, tek satırlık kriptik bir regex yazmaktan çok daha okunabilir ve sürdürülebilirdir.

Açgözlü ve isteksiz niceleyicileri karıştırmak da sık görülen bir hatadır. Beklenmedik biçimde uzun bir eşleşme aldığınızda, önce niceleyicinizin açgözlü mü isteksiz mi olduğunu kontrol etmek, hatanın kaynağını genelde saniyeler içinde ortaya çıkarır.

Regex'i Ne Zaman Kullanmamalı

Regex güçlüdür ama her probleme uygun değildir. HTML veya JSON gibi iç içe geçmiş, yapılandırılmış verileri ayrıştırmak için regex yerine o formata özel bir ayrıştırıcı kullanmak çok daha güvenilirdir; regex, iç içe geçmiş parantez ve etiket yapısını doğru biçimde takip edemez, karmaşık HTML'de garip kenar durumlarına takılır.

Basit string işlemleri için de regex'e gerek yoktur. Bir metnin belirli bir kelimeyle başlayıp başlamadığını kontrol etmek için, çoğu dilin yerleşik startswith benzeri fonksiyonu regex'ten hem daha hızlı hem daha okunabilirdir. Regex'i, gerçek bir kalıp eşleştirme ihtiyacı olduğunda devreye sokmak, kodun hem performansını hem okunabilirliğini korur.

Küçük bir desenle başlayıp test aracında doğrulamak, ardından ihtiyaç oldukça genişletmek en sürdürülebilir öğrenme yoludur. Birkaç gerçek problemi regex ile çözdükten sonra, karşınıza çıkan yeni bir kalıp artık gizemli değil, tanıdık bir yapı gibi görünmeye başlar.

Regex'i Farklı Araçlarda Kullanmak

Aynı temel sözdizimi, komut satırından metin editörlerine kadar birçok ortamda karşınıza çıkar. Bir kod tabanında belirli bir fonksiyon çağrısının tüm kullanımlarını bulmak için IDE'nin regex destekli aramasını kullanmak, tek tek dosya açıp kontrol etmekten çok daha hızlıdır. Komut satırında metin dosyalarını regex ile filtrelemek, günlük analiz veya toplu yeniden adlandırma gibi işlerde zaman kazandırır.

Programlama dillerinin çoğu regex'i standart kütüphanesinde barındırır; bu da veri doğrulama, ayrıştırma ve dönüştürme işlemlerini doğrudan koda gömmenizi sağlar. Diller arasında küçük sözdizimi farkları olsa da (örneğin bazı diller adlandırılmış yakalama gruplarını farklı yazar), temel mantık aynı kaldığı için bir dilde öğrenilen regex bilgisi diğerine kolayca taşınır.

Kaynaklar ve doğrulama

Bilgileri uygulamadan önce güncel ayrıntıları aşağıdaki birincil veya alan otoritesi kaynaklardan kontrol edin.

Celil Uyanikoglu

Yazan Celil Uyanikoglu

Bilgisayar mühendisiyim; 25 yılı aşkın süredir bilgi işlem sektörünün içindeyim. Bu blogu 2020'de, işimde her gün karşılaştığım sorunların çözümlerini bir yere yazmak için açtım: Linux, güvenlik, tarayıcılar, yapay zeka araçları. Yazdığım her rehberi önce kendi bilgisayarımda ya da sunucumda deniyorum; çalıştığını görmediğim adımı yayınlamam. Hatalı ya da eskimiş bir şey görürsen iletişim sayfasından yaz — düzeltirim.

Yorum

Henüz yorum yok.

Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.

Yorum yap

E-posta adresin yayınlanmaz. Yorumlar moderasyondan sonra yayınlanır.

Sırada

İlgili notlar