Geliştiriciler

Düzenli İfade Nasıl Online Test Edilir (Gerçek Örneklerle)

7 dk okuma

Bir düzenli ifadeyi test etmenin yolu şudur: deseni yazın, uygun bayrakları seçin, gerçek bir test metnine karşı çalıştırın, sonra hem vurgulanan eşleşmeleri hem de varsa yakalanan grupları gözle kontrol edin. Ancak bu üç adımdan geçen bir desen koda gömülmeye hazırdır; aksi halde production’da sessizce yanlış davranan bir regex’iniz olur.

Desen, bayraklar ve gruplar ne işe yarar

Bir regex deseni / / sınırlayıcıları arasında yazılır, tıpkı /^\d+$/ gibi. Sınırlayıcıların dışında dört bayrak seçebilirsiniz, ve her biri motorun davranışını farklı bir şekilde değiştirir:

  • g (global): desen sadece ilk eşleşmede durmaz, metindeki her oluşumu bulur.
  • i (case-insensitive): büyük/küçük harf ayrımını yok sayar, Ali da ALI da ali da eşleşir.
  • m (multiline): ^ ve $ artık tüm metnin başı/sonu değil, metindeki HER satırın başı/sonu anlamına gelir.
  • s (dotAll): normalde satır sonlarını atlayan . karakteri, bu bayrakla satır sonlarını da eşleştirir.

Parantezler, (), eşleşen kısmın bir parçasını yakalar; bu yakalanan parça sonradan ayrı ayrı okunabilir. (?<year>\d{4}) gibi isimli gruplar da desteklenir, böylece sonucu numaraya göre değil isme göre okursunuz, kod okurken hangi grubun ne olduğunu hatırlamanıza gerek kalmaz.

Bayraklar tek başına değil, birlikte de kullanılır. Çok satırlı bir log dosyasında her satırın başındaki tarih damgasını bulmak istediğinizde g ve m’yi birlikte açarsınız: g tüm satırları taratır, m ise ^’nin her satır başında yeniden başlamasını sağlar. m olmadan ^, sadece dosyanın en başındaki tek bir noktaya işaret eder, ikinci satırdan itibaren hiçbir şey eşleşmez. s bayrağı ise daha nadir gerekir; genelde <script>...</script> gibi birden çok satıra yayılan bir bloğu tek bir .* ile yakalamanız gerektiğinde işe yarar, çünkü bayrak olmadan . satır sonunda durur ve blok orada kesilir.

Dört gerçek örnek üzerinden

Aşağıdaki tablo, gerçek kodda karşınıza çıkabilecek dört deseni, bunların neyi eşleştirip neyi eşleştirmediğini ve yakaladıkları grupları özetliyor:

DesenBayraklarEşleşirEşleşmezYakalar
^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$yokjane.doe@example.comjane@example (üst düzey alan adı yok)yok
#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})g#2F7BFF, #fff#12G456 (G onaltılık değil)Grup 1: 2F7BFF
\/(\w+)\/(\w[\w-]*)g/users/123, /products/abc-456/users (ikinci segment yok)Grup 1: kaynak türü, Grup 2: id
^\d{4}-\d{2}-\d{2}$yok2026-07-1107/11/2026 (yanlış format)yok

REST yol deseniyle başlayalım: \/(\w+)\/(\w[\w-]*). Baştaki \/ kaçışlı bir eğik çizgidir, ardından (\w+) gelir, yani bir veya daha fazla kelime karakteri (harf, rakam, alt çizgi) ve bunu ilk grup olarak yakalar. Sonra ikinci bir \/ ve ikinci grup, (\w[\w-]*), yani en az bir kelime karakteriyle başlayıp ardından kelime karakteri veya tire içerebilen bir dizi. Bu ikinci grubu \w[\w-]* şeklinde yazmanın nedeni basit: id’nin abc-456 gibi tire içerebilmesine izin vermek ama -abc gibi tire ile başlamasına izin vermemek. /users/123 üzerinde çalıştırdığınızda Grup 1 users, Grup 2 123 olur; /products/abc-456 üzerinde Grup 1 products, Grup 2 abc-456 olur. g bayrağı burada kritik, çünkü tek bir URL listesinde onlarca yol olabilir ve bayrak olmadan regex ilk eşleşmeden sonra durur, geri kalan tüm yolları göz ardı eder. Bu deseni bir router’da kullanıyorsanız Grup 1’i kaynak tipine (users, products) göre dallanmak için, Grup 2’yi de doğrudan id olarak veritabanı sorgusuna geçirmek için kullanırsınız.

Hex renk deseni de benzer bir mantıkla çalışır ama farklı bir sorunu çözer: #([0-9a-fA-F]{6}|[0-9a-fA-F]{3}). Dış kısım # ile başlar, sonra parantez içinde iki alternatif var, dikey çubukla (|) ayrılmış: ya tam olarak 6 onaltılık basamak ya da tam olarak 3 onaltılık basamak. [0-9a-fA-F] karakter sınıfı 0-9, a-f ve A-F aralıklarını kapsar, yani hem küçük hem büyük harfli onaltılık gösterimi kabul eder. #2F7BFF üzerinde 6 basamaklı dal eşleşir ve Grup 1 2F7BFF olur; #fff üzerinde 3 basamaklı dal eşleşir ve Grup 1 fff olur. #12G456 eşleşmez çünkü G, 0-9a-fA-F sınıfının dışında kalır. Burada da g bayrağı işin can damarı: bir CSS dosyasından kullanılan tüm marka renklerini çıkarmak istediğinizde, bayrak olmadan sadece dosyadaki İLK renk kodunu bulursunuz, geri kalan onlarca #hex değeri tamamen atlanır. g ile çalıştırdığınızda her eşleşmenin Grup 1’i, dosyadaki her rengin # işareti olmadan saf onaltılık değerini verir, bu da bir renk paleti raporu oluşturmak veya tasarım tokenlarıyla karşılaştırmak için doğrudan kullanılabilir bir liste anlamına gelir.

E-posta ve tarih desenleri daha sade: ikisi de baştan sona tüm dizeyi doğrulamak için ^ ve $ çapalarını kullanıyor ve hiçbir yakalama grubu içermiyor, çünkü amaçları parça çıkarmak değil, formatın geçerli olup olmadığını evet/hayır olarak söylemek. E-posta deseninde [\w.+-]+ kullanıcı adı kısmını, [\w-]+ alan adını, [a-zA-Z]{2,} da en az iki harften oluşan üst düzey alan adını (.com, .tr, .info) karşılar; jane@example bu son parçayı hiç içermediği için desen baştan reddeder. Tarih deseni ise sadece rakam sayımına bakar: dört rakam, tire, iki rakam, tire, iki rakam. 07/11/2026 biçim olarak tamamen makul bir tarih olsa da ayırıcı karakter tire değil eğik çizgi olduğu için eşleşmez; bu, bir form alanına “yalnızca ISO 8601 formatı kabul edilir” yazmak yerine kullanıcıya anında geri bildirim vermenin en pratik yolu.

Kendi deseninizi deneyin

Kendi regex’inizi yazıp gerçek bir test metnine karşı çalıştırmak için aşağıdaki aracı kullanın, sonuç yazarken anında güncellenir.

/ /
Regex Test Aracı
Ücretsiz, kayıt yok, her cihazda çalışır.
Tam aracı aç

Yaygın hatalar ve uç durumlar

g bayrağını unutmak. Bu olmadan regex ilk eşleşmeden sonra durur ve tüm oluşumları bekleyen her şeyi (örneğin bir “tümünü değiştir” işlemini) sessizce bozar. Kodda match() yerine matchAll() kullanmanız gerektiğinde de aynı unutkanlık sizi vurur; motor sadece ilk sonucu döndürür, geri kalanı sanki hiç yoklarmış gibi davranır.

Kaçışsız nokta. Kaçışsız bir . gerçek bir noktayı değil, HERHANGİ bir karakteri eşleştirir. Desen olarak 192.168.1.1, 192X168X1X1 ile de eşleşir. Gerçek bir nokta için \. kullanın. Bu hata özellikle IP adresi veya sürüm numarası (1.2.3) doğrulayan desenlerde sinsi bir şekilde ortaya çıkar, çünkü test verisi genelde gerçek noktalar içerir ve hata fark edilmez.

Açgözlü ve tembel niceleyiciler. .* mümkün olduğunca fazlasını alır (açgözlü) ve amaçlanan noktanın çok ötesine geçebilir, örneğin bir HTML bloğunun tamamında tek bir etiket yerine ilk < işaretinden SON > işaretine kadar eşleşir. .*? (tembel) mümkün olan en erken noktada durur. HTML veya JSON gibi iç içe geçmiş yapılarda açgözlü niceleyici, aralarında birden fazla etiket varken tüm bloğu tek bir eşleşme sanır.

Eksik çapalar. ^ ve $ olmadan bir desen metnin herhangi bir yerinde ALT DİZE olarak eşleşebilir, bu yüzden çapasız bir “doğrulama” deseni, yalnızca geçerli bir bölüm İÇEREN bir dizeyi geçerli sayabilir ve geçersiz girdinin sızmasına izin verir. ^ ve $ tüm dizenin eşleşmesini zorunlu kılar. Örneğin çapasız \d{4}-\d{2}-\d{2} deseni, not a date, 2026-07-11 is gibi tamamen geçersiz bir girdiyi de kabul eder çünkü metnin ortasındaki geçerli parçayı bulmuş olur.

Sıkça sorulan sorular

g bayrağını kullanmakla kullanmamak arasındaki gerçek fark nedir? g olmadan motor ilk eşleşmeyi bulur bulmaz durur ve o tek sonucu döndürür. g ile motor tüm metni tarar, bulduğu her eşleşmeyi bir listeye ekler ve hepsini döndürür. Tek bir alanı doğrularken (örneğin tek bir e-posta girişi) g’ye ihtiyacınız yoktur; bir metin bloğundan tüm URL’leri veya tüm hex renkleri çıkarırken g olmadan sadece birinciyi alırsınız.

Nokta, dolar işareti veya parantez gibi gerçek bir özel karakteri nasıl eşleştiririm? Karakterin önüne ters eğik çizgi koyarsınız: gerçek bir nokta için \., gerçek bir dolar işareti için \$, gerçek bir açık parantez için \(. Kaçış işareti olmadan bu karakterler regex motoruna özel bir komut olarak yorumlanır, . herhangi bir karakter, $ dize sonu, ( bir grubun başlangıcı anlamına gelir; kaçışla ise sadece o karakterin kendisini ararsınız.

Yakalamayan grup, (?:...), nedir ve normal bir (...) grubu yerine ne zaman ihtiyacım olur? (?:...) bir alt deseni gruplar (örneğin bir niceleyici veya alternatif uygulamak için) ama sonucu ayrı bir yakalama olarak saklamaz. Deseninizde sadece gruplama mantığına ihtiyacınız varsa, sonucu ayrıca okumayacaksanız, (?:...) kullanın; bu hem sonuç dizisini gereksiz gruplarla şişirmez hem de birden fazla grup içeren karmaşık desenlerde grup numaralarının kaymasını önler.

Bu araç desenimi veya test metnimi herhangi bir yere gönderiyor mu? Hayır, her şey tarayıcıda yerleşik JavaScript RegExp motoruyla çalışır, hiçbir şey bir sunucuya gönderilmez. Bu yüzden hassas örnek veriler (gerçek e-posta adresleri, iç URL yapıları) üzerinde deseninizi test etmekten çekinmenize gerek yok.

RegexDoğrulamaGeliştiricilerDüzenli İfadeler
Regex Test Aracı
Şimdi tam araçla kendin dene.
Şimdi dene