Regex Neden Eşleşmiyor? Bayraklar, Satır Sonları ve Kaçış Karakterleri
İçindekiler
- Doğrudan Teşhis: Geçerli Görünen Bir Regex Neden Eşleşmez?
- Temel Bayraklar: g, i, m ve s (m ile s Bayraklarını Karıştırmayın)
- Açgözlü (.*) ile Tembel (.*?) Nicelik Belirteçleri
- Kaçış Karakterleri ve Ters Eğik Çizgi Tuzağı (Karakter Sınıfı vs. Dış Bağlam)
- GoToolstack Motorunda Doğrulanmış Gerçek Örnekler
- Motor Farklılıkları ve ReDoS Felaketi
- GoToolstack İstemci Taraflı Geliştirici Araçları
- Teknik Referanslar ve Resmi Standartlar
1. Doğrudan Teşhis: Geçerli Görünen Bir Regex Neden Eşleşmez?
Sözdizimsel olarak hatasız görünen bir düzenli ifade (Regex); eksik bayraklar, beklenmeyen satır sonları veya yanlış kaçış karakterleri nedeniyle çalışmayabilir. Deseniniz 0 eşleşme veriyorsa veya tek bir kelime yerine tüm metni yutuyorsa, sorun neredeyse her zaman regex motorunun metni tarama kurallarından kaynaklanır.
Deseninizi baştan yazmadan önce şu temel yürütme mekanizmalarını sırayla inceleyin:
2. Temel Bayraklar: g, i, m ve s (m ile s Bayraklarını Karıştırmayın)
Bayraklar motorun çalışma kurallarını belirler. JavaScript (ve ECMAScript standardında) en yaygın kullanılan temel bayraklar şunlardır:
- g (Global): İlk eşleşmede durmak yerine aramanın metnin tamamı boyunca devam etmesini sağlar.
- i (Büyük/Küçük Harf Duyarsız): Harf duyarlılığını kaldırır, büyük ve küçük harfleri eşit kabul eder.
- m (Çok Satırlı):
^ve$işaretlerinin yalnızca tüm metnin değil, her bir satırın başı ve sonu ile eşleşmesini sağlar. - s (dotAll): Nokta (
.) karakterinin yeni satır (\n,\r) karakterlerini de kapsamasını sağlar.
KRİTİK FARK: Çok satırlı (m) bayrağı noktanın (.) yeni satırları geçmesini SAĞLAMAZ! Benzer şekilde dotAll (s) bayrağı da ^ ve $ işaretlerinin satır başı/sonu yakalamasını DEĞİŞTİRMEZ. Bu iki bayrağı karıştırmak çok satırlı Regex hatalarının bir numaralı sebebidir.
3. Açgözlü (.*) ile Tembel (.*?) Nicelik Belirteçleri
Varsayılan olarak *, +, {min,max} nicelik belirteçleri açgözlüdür (greedy): sonraki kuralları karşılamak için geriye doğru adım atmadan önce tüketebilecekleri maksimum karakteri alırlar.
Şu metinden HTML etiketlerini ayrıştırdığınızı varsayın: <div>İlk</div><div>İkinci</div>
Açgözlü Desen <div>.*</div>: İlk açılış etiketinden en sondaki kapanış etiketine kadar tüm metni tek bir blok olarak yutar.
Tembel Desen <div>.*?</div>: Soru işareti eklenerek tembel (lazy) hale getirilen desen, ilk kapanış etiketinde durur (<div>İlk</div>). Ancak metindeki her iki bağımsız eşleşmeyi de yakalayabilmek için global bayrağın (g) eklenmesi zorunludur (/<div>.*?</div>/g). Global bayrak olmadan regex motoru ilk eşleşmeden sonra aramayı derhal sonlandırır.
4. Kaçış Karakterleri ve Ters Eğik Çizgi Tuzağı (Karakter Sınıfı vs. Dış Bağlam)
Düzenli ifadelerde sözdizimsel rezerve karakterler şunlardır: \ ^ $ . | ? * + ( ) [ { } ]. Kaçış kuralları bağlama göre değişiklik gösterir:
- Karakter Sınıfları Dışında: Bu karakterlerin tümü düz noktalama olarak aranırken ters eğik çizgiyle (örneğin
\.,\$,\() kaçırılmalıdır. - Karakter Sınıfları İçinde (
[...]): Çoğu metakarakter özel anlamını kaybeder ve düz metin gibi eşleşir (örneğin[.]doğrudan nokta,[*]doğrudan yıldız eşler). Köşeli parantez içinde yalnızca^(başta ise olumsuzlama),-(aralık belirteci),](sınıf kapatıcı) ve\(kaçış) özel anlama sahiptir.
JavaScript kaynak kodunda doğrudan regex literali ile dize yapıcı (new RegExp()) ayrımına dikkat edin:
// 1. Regex Literal (single backslash required)
const reLiteral = /^\d+\.\d+$/;
// 2. String Constructor (double backslash mandatory)
const reConstructor = new RegExp("^\\d+\\.\\d+$");5. GoToolstack Motorunda Doğrulanmış Gerçek Örnekler
Aşağıdaki senaryolar ECMAScript motorunda gerçek girdiler ve beklenen çıktılarla doğrulanmıştır:
| Senaryo ve Girdi | Desen ve Bayraklar | Doğrulanmış Beklenen Eşleşme |
|---|---|---|
ERROR 404 /api\nINFO 200 /home\nERROR 500 /db |
/^ERROR\s+(\d+)/gm |
ERROR 404, ERROR 500 |
Total cost: $49.99 USD |
/\$(\d+\.\d{2})/ |
$49.99 |
/* Multi-line |
/\/\*.*?\*\//s |
/* Multi-line |
6. Motor Farklılıkları ve ReDoS Felaketi
GoToolstack düzenli ifade test edicisi tarayıcınızın yerel ECMAScript motorunu kullanır. Python, PCRE veya Go'dan desen aktarırken şu sınırlara dikkat edin:
- Lookbehind Desteği: Modern ECMAScript pozitif
(?<=...)ve negatif(?<!...)lookbehind ifadelerini destekler. Eski tarayıcılarda sözdizimi hatası verebilir. - İyelik Nicelikleri Yoktur: JavaScript motorunda PCRE'de bulunan iyelik nicelikleri (
.*+) veya atomik gruplar(?>...)bulunmaz. - Felaket Düzeyinde Geri İzleme (ReDoS):
(a+)+$gibi iç içe açgözlü desenler eşleşmeyen dizelerde katlanarak milyarlarca kombinasyon dener ve tarayıcıyı kilitler. GoToolstack testleri Web Worker içinde zaman aşımı korumasıyla izole eder. - Kusursuz E-posta Efsanesi: Yüzlerce karakterlik devasa regex'lerle RFC 5322 standardını tek seferde doğrulama çabaları bakım zorluğu ve performans riski yaratır. Basit yapısal kontrol ve onay e-postası göndermek endüstri standardıdır.
7. GoToolstack İstemci Taraflı Geliştirici Araçları
Düzenli ifadelerinizi tarayıcınızda sunucuya göndermeden güvenle test edin ve oluşturun:
Teknik Referanslar ve Resmi Standartlar
- MDN Web Docs: JavaScript Düzenli İfadeler (RegExp) Kılavuzu.
- ECMA-262: ECMAScript Dil Belirtimi - RegExp Nesneleri.
- OWASP: Düzenli İfade Hizmet Reddi (ReDoS) Önleme Kılavuzu.