Düzenli İfadeler 🐥

Düzenli ifadeler yani "regular expressions" nedir, nasıl kullanılır gibi konuları bu bölümde işleyeceğiz.
Açılın ben regex biliyorum!

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'den korkmuyoruz, değil mi?
regex yazan kısmı JavaScript ile değiştirmek ister misin?

Regex Kullanım Alanları

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

E-Mail Kontrolü
Güvenli Parola Kontrolü
Yazıdan Saat Ayıklama
E-Mail Kontrolü

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][email protected][^@\s]+\.\w{2,6}$/g;
const result = regex.exec(input)
//S onuç null ise eşleşme bulunamadı
return !!result
}
const tests = [
`[email protected]`, // Geçerli
'', // Geçersiz
`test.test`, // Geçersiz
'@[email protected]', // Geçersiz
'[email protected]@cali.com', // Geçersiz
`cagatay.me`, // Geçersiz
`acilin ben regex [email protected]`, // Geçersiz
`[email protected]@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.

Güvenli Parola Kontrolü

Regex

((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,35})

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

( # Grup başlangıcı
(?=.*\d) # 0-9 arasında bir sayı içermeli
(?=.*[a-z]) # bir küçük karakter içermeli
(?=.*[A-Z]) # bir büyük karakter içermeli
(?=.*[@#$%]) # listedeki bir özel karakteri içermeli "@#$%"
. # yukarıdaki tüm kontrollerden geçtikten sonra
{6,20} # minimum 6 maksimum 20 karakter uzunluğunda
) # "Bir metin olmalı" desenini bitir

?= Tek başına anlam ifade etmez diğer tüm durumları içerdiğinde true döndürür.

Yazıdan Saat Ayıklama

Regex

/\b([01]?[0-9]|2[0-3]):([0-5]\d)/

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.