« Normal ifade test etmek » ne anlama gelir ?
Normal ifade test etmek (« regex test online », « tester regex javascript ») gerçek bir metne desen çalıştırmaktan ve motorun tam olarak ne döndürdüğünü gözlemlemekten ibarettir : eşleşen dizgiler, bu dizgilerin konumu ve yakalama gruplarının değerleri. « doğru görünen » bir desen, sizin verileriniz üzerinde çalışmadan hiçbir şey söylemez — eğitimdeki regex ile üretimdeki regex arasındaki tek fark budur.
Test üç ayrı soruya yanıt verir. Eşleşiyor mu : eşleşme tablosu bunu ilk satırda söyler. Nerede ve kaç kez : indeks ve uzunluk, çapanın doğru yerde olup olmadığını gösterir. Neyi yakalıyor : numaralı ya da adlı gruplar, çıkarmayı planladığınız kısmın gerçekten o kısım olup olmadığını ortaya koyar.
Tüm farkı yaratan meta karakterler
Nokta . yeni satır dışında herhangi bir karakterle eşleşir — bu yüzden bayrak s metniniz çok satırlıyken kullanılır. Nicelikleyiciler *, + ve ? aslında açgözlüdür : ilk yeterli tekrar sayısında dururlar. Sonek ? (*?, +?, {2,5}?) bu davranışı tersine çevirir ve tembel sürümü verir, bir .* satır sonunu yuttuğunda neredeyse her zaman tercih edilmesi gereken sürüm budur.
Köşeli parantezler bir sınıf tanımlar : [abc] listelenenlerden bir karakteri kabul eder, [^abc] onlardan hariç her şeyi, [a-z0-9] bir aralığı. Sınıf başındaki negasyona dikkat : [^...] yalnızca ilk konumda geçerlidir, aksi halde ^ yeniden literal olur. Boru işareti | alternatifleri ayırır ve düşük öncelikli gibi davranır : ^cat|dog$ şunu demektir : « tüm metin cat'tir » ya da « tüm metin dog'dur », « başta cat ya da sonda dog » değil — bu durumda gruplamak gerekir : ^(?:cat|dog)$.
Gruplar, lookahead ve lookbehind
Parantezler yakalar. 1 numaralı gruba $1 değiştirme tarafında, \1 desen tarafında ise adlı gruplar $<nom> ve \k<nom> ile erişilir — üç gruptan itibaren çok daha okunaklıdır. (?:...) numara oluşturmadan gruplar; yalnızca yapı için yakalama yapıyorsanız bunu tercih etmek gerekir.
Bu kontroller (lookaround) tüketmeden doğrular : (?=...) sonrakinin eşleşmesini zorunlu kılar, (?!...) bunu yasaklar, (?<=...) ve (?<!...) aynısını önceki kısım için yapar. Bir parolada özel bir karakter, yakalamaya dahil edilmeden böyle zorunlu kılınır : ^(?=.*\d)(?=.*[A-Z]).{12,}$.
ReDoS : regex bir zaman bombasına dönüştüğünde
Kısaca ReDoS (Regular Expression Denial of Service) aslında backtracking : neredeyse eşleşen bir girdiye karşı bir desen (a+)+$ « a »ları ayırmanın tüm yollarını, başarısız olana kadar dener ve patlama sayısı üstel olarak büyür. İki alışkanlık : deseni gerçekçi bir hacimde test etmek — Performans sekmesi bunu sizin için yapar — ve denetlenemeyen bir regex'i, boyut sınırı olmayan dış bir girdiye asla çalıştırmamak. Bir sunucuda takılan bir regex, zaman aşımı dolana kadar tüm worker'ı dondurur.
JavaScript, PCRE, Python : aynı temeller, birkaç fark
Test aracı tarayıcının yerel motorunu, yani ECMAScript'i kullanır. Temel sözdizimleri — sınıflar, nicelikleyiciler, gruplar, lookahead, bayraklar g i m s u y — PCRE (PHP, Perl), rePython ile Java ve Go'da ortaktır. Farklar özellikle lookbehind (uzun süre JavaScript'te yoktu, artık destekleniyor), Unicode özellikleri ve (?i)gibi satır içi bayraklar üzerindedir; bunlar PCRE'ye özgüdür. Bir deseni bir dilden başka bir dile çevirmek dolayısıyla detay işidir — icat değil.
Kimler için önerilir
Front-end ve back-end geliştiricileri (form doğrulama, günlük ayrıştırma, veri göçü), ops ve DevOps (yapılandırma filtreleri, WAF kuralları), test uzmanları ve analistler (sütun çıkarma, biçim denetimi), içerik yazarları ve veri analistleri (dosya temizliği), öğrenciler (meta karakterleri anlamak) ve normal ifade test aracına ihtiyaç duyan herkes için hızlı, eksiksiz ve gizli bir sonuç isteyenler — yanındaki diğer araçlar ise : JSON biçimlendirici, URL kod çözücü, Base64 kod çözücü ve JWT kod çözücü.