Düzenli İfadeler 🐥

Düzenli ifadeler yani "regular expressions" nedir, nasıl kullanılır gibi konuları bu bölümde işleyeceğiz.

Terminoloji - Regex Tam Olarak Nedir?

Regex yani düzenli ifadeler temelde bir katar / metin (string) içerisinde belirli desenleri tanımak için tasarlanmıştır. Temeli matematiksel bir yapıya dayanmaktadır "otomata teorisi" fakat biz bu temele değinmeyeceğiz. Tüm programlama dillerinin zühreviyatında regex - regexp mevcut demek yersiz olmayacaktır. Yazdığımız betikleri, programları tanıyan ve bunları makine diline çeviren yapılar aynı şekilde otomata teorisini ve regex'leri kullanmaktadır.

Regex Kullanım Alanları

Kullanım alanlarına birkaç örnek verelim,

Regex

^[^@\s]+@[^@\s]+\.\w{2,6}$

Adım adım açıklayalım,

  • ^ -> Girdi başlangıcı.

  • [^@\s] -> Boşluk \s ve @ karakteri dışındakileri eşleştir.

  • + -> 1+ kere.

  • @ -> @ karakterini eşleştir.

  • [^@\s]+ -> Boşluk \s ve @ karakteri dışındakileri eşleştir. 1+ kere.

  • \. -> . karakterini eşleştir.

  • \w{2,6} -> 2-6 karakter arasında tüm karakterleri eşleştir (sayı, alt çizgi veya harf).

  • $ -> Girdi sonu

Gerçek hayatta karşılaşabileceğiniz senaryolar;

const isValidEmail = input => {
  /*
    Aşağıdaki regex'i yayında kullanmayınız!
    %100 eşleşme sağlamaz. 
    Demo amaçlıdır.
  */
  const regex = /^[^@\s]+@[^@\s]+\.\w{2,6}$/g;
  const result = regex.exec(input)

  //S onuç null ise eşleşme bulunamadı
  return !!result
}

const tests = [
  `cagatay.cali@gmail.com`, // Geçerli
  '', // Geçersiz
  `test.test`, // Geçersiz
  '@cagatay@cali.com', // Geçersiz
  'cagatay@@cali.com', // Geçersiz
  `cagatay.me`, // Geçersiz
  `acilin ben regex biliyorum@test.com`, // Geçersiz
  `cok.bozdu@lost.cok.bozdu@gmail.com` // Geçersiz
]

console.log(tests.map(isValidEmail))

Dilerseniz %99 oranında e-mail eşleşmesini sağlayabileceğiniz onaylı regex'i tercih edebilirsiniz;

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

Spesifikasyon

Regex sonucunda TLD (top level domain) kontolü - uzantı kontrolü yapmanızı şiddetle tavsiye ederim. abc uzantılı bir alan adı olmadığı sürece geçersiz bir e-posta olduğunu varsaymalı ve sisteme e-posta onayı ile kişileri almalıyız.

Ne Zaman Regex Kullanmamalısın

Yazılım dili tespiti

Kendi hazırladığın yazılım dilini tespit etmek için regex yazmaya hazırlanıyorsan derin bir nefes al, bu senin için acı verici olabilir.

Güvenlikle İlgili Kritik Giriş Filtreleme ve Kara Listeler

Hazırladığın platforma kullanıcının gireceği verilerin kontrolünü regex ile kontrol ediyorsan, olası tüm senaryoları öngördüğüne emin olmalısın. Bu durumlarda regex her zaman en pratik çözüm olmayabilir.

Performans Öncelikli Bölümler

Regex eşleştirme hızı senin hazırladığın desene göre sistemi performans darboğazına sokabilir. Bu, çoğu durumda, özellikle girdi kısa ve kesin ise (e-posta kontrolü) kullanışlı olabilir. Bununla birlikte hazırladığın regex ifadesi zayıf ise sistemine ek yük bindirebileceğini göz önünde bulundurmalısın.

Regex Gerektirmeyen Problemler

Regex katarları işlemek için çok verimli bir araç olsa dahi her zaman kullanmanı gerektirmez. Okunabilir, tekrar yazılabilir, modülarize bir şekilde regex ifadelerini yazmak meşakkatli olacak ise lütfen daha az zahmet gerektiren şekilde problemini çöz, bu seni daha az zeki yapmayacaktır.

Last updated