Yapı taşları
^ ve $ sınırları, [A-Z] karakter kümesini, \d rakamı, + bir veya daha fazla tekrarı belirtir. Parantezler gruplar, | alternatifler oluşturur.
/^\d{4}$/ tam dört rakamı sınar. i, g, m ve s bayrakları davranışı değiştirir; hedef dilde doğrulayın.
Amaç ve kapsam
Regex karmaşık standardın bütün geçerliliğini her zaman tek başına denetlemez. E-posta biçimini yüzeysel kontrol etmek, adresin gerçekten var olduğunu doğrulamaktan farklıdır.
Önce kabul ve ret örnekleri yazın. Boş girdi, Unicode, satır sonu ve en uzun değerleri ekleyin.
JavaScript kaçışları
Regex literalinde özel karakterlerin anlamı vardır. RegExp kurucusuna metin verirken JavaScript string kaçışları da devreye girer.
Deseni küçük parçalara bölüp her değişiklikte test edin. Uygulamanın kullandığı motor ve bayrakları kullanın.
Performans ve güvenlik
İç içe, geniş ve belirsiz tekrar desenleri bazı girdilerde çok uzun çalışabilir. Dış girdiyi işleyen servislerde uzunluk sınırı ve kötü durum testi kullanın.
Doğrulama aracı, hatalı girdiyi sessizce düzeltmek yerine açık hata vermelidir.
Regex’i küçük parçalardan kurma
Önce kabul etmek istediğiniz örnekleri ve reddetmeniz gereken sınır durumlarını yazın. Ardından literal karakterleri, sınıfları, tekrarları ve grupları tek tek ekleyerek deseni genişletin. Örneğin tarih biçimini kontrol etmek için gün ve ay sayısına yönelik yüzeysel sınır koyabilirsiniz; ancak takvimde gerçekten var olan tarihi doğrulamak için tarihi ayrıştırıp takvim kurallarını da denetlemek gerekir. Aynı şekilde e-posta biçiminde basit kontrol, posta kutusunun varlığını veya teslim edilebilirliğini kanıtlamaz. Kullanıcı arayüzünde hata mesajı anlaşılır olmalı; sadece 'regex eşleşmedi' demek yerine hangi alanın beklenen biçime uymadığını söyleyin.
Unicode ve hedef regex motoru
Regex sözdizimi diller ve motorlar arasında farklılık gösterebilir. Unicode harf sınıfları, lookbehind, named group, bayrak davranışı ve satır sonu işleyişi kullandığınız dile göre değişebilir. JavaScript’te kaynak koduna literal yazılan desen ile `RegExp` kurucusuna string verilen desenin kaçış aşamaları farklıdır; çift ters eğik çizgi gerekip gerekmediğini test edin. Türkçe harfler, emoji, birleşik Unicode karakterler ve farklı satır sonlarını sınır örneklerine ekleyin. Bir test sitesinde çalışan desen hedef uygulamada desteklenmeyebilir; üretimde aynı motoru ve sürümü kullanarak kontrol edin. Regex üreticisi veya tester sonucu, tüm giriş verilerinin anlamca doğru olduğunu kanıtlamaz.
Regex kaynaklı yavaşlama riskleri
İç içe belirsiz tekrarlar, aynı karakterleri birçok yoldan tüketebildiğinde bazı regex motorlarında çok sayıda olasılığı denetleyebilir. Uzun veya saldırgan biçimde hazırlanmış girdi bu işlemi büyütebilir. Özellikle sunucuda dış kullanıcının kontrol ettiği metni işliyorsanız maksimum uzunluk belirleyin, kötü durum örnekleriyle süre ölçün ve daha basit bir ayrıştırıcıya geçmenin uygun olup olmadığını değerlendirin. Desene sonradan eklenen `.*` veya geniş alternatiflerin etkisini ayrı test edin. Düzenli ifadeyi yalnız kısa alan denetiminde kullanmak, karmaşık bir dil veya HTML belgesini tamamen ayrıştırmaya çalışmaktan genellikle daha okunaklıdır. Performans kaygısı varsa zaman aşımı ve kaynak sınırı tasarlayın.
Test matrisi ve bakım
Bir regex’i sadece bir olumlu örnekle onaylamayın. En azından beklenen geçerli örnekleri, sınır uzunluğunu, boş değeri, fazla ayırıcıyı, yanlış sırayı, Unicode harfleri ve son satır sonunu içeren örnekleri tutun. Bunları küçük bir test listesinde saklamak desen değiştiğinde eski davranışın bozulmasını yakalar. Regex yanına kısa bir açıklama ve motor bilgisini ekleyin; aylar sonra hangi grup numarasının ne anlama geldiğini çıkarmak zor olabilir. Desen büyüyüp okunması zorlaşırsa adlandırılmış gruplar, birden fazla açık kontrol veya uygun parser kullanın. Tester hızlı deney alanıdır; uygulama kodunda otomatik regresyon testinin yerini tutmaz.
Örnek iş akışı: alan biçimini katmanlı doğrulama
Bir formdaki ürün kodunun iki harf, tire ve dört rakamdan oluşması bekleniyorsa önce birkaç geçerli ve geçersiz örnek hazırlayın; ardından deseni adım adım kurun. `^[A-Z]{2}-\d{4}$` biçimi bu görünüşü sınayabilir, fakat harflerin gerçekten tanımlı ürün grubuna ait olup olmadığını kontrol etmez. Uygulama kodu regex eşleşmesinden sonra katalog verisinde ürün kodunu aramalıdır. Küçük harf, boşluk, boş değer, Unicode harf ve gereğinden uzun girdi için karar verin. Deseni JavaScript literalinde ve kullanılan runtime’da çalıştırıp regresyon örneklerini otomatik teste ekleyin. Sunucu dış girdi alıyorsa uzunluk sınırı belirleyin ve kötü durum desenlerinin çalışma süresini ölçün. Regex biçim filtresidir, veri kaynağı doğrulayıcısı değildir.
Uygulanabilir kısa kontrol listesi
- Olumlu ve olumsuz gerçek örnekleri belirleyin.
- Deseni küçük parçalarla hedef motor ve bayraklarda sınayın.
- Uzun, Unicode ve kötü biçimli girdilerde doğruluğu ve süreyi kontrol edin.
Sık sorulan sorular
Regex bütün e-postaları doğrular mı?
Kısa regex ile standardı ve adres varlığını kanıtlamak mümkün değildir.
Tester uygulamamla aynı sonucu verir mi?
Aynı motor, bayraklar ve varsayımlar kullanılıyorsa karşılaştırılabilir.
Regex performans sorunu çıkarır mı?
Bazı desenler kötü girdilerde fazla çalışabilir; uzunluk sınırı koyup test edin.