Regex Test Aracı rehberi
XGM Regex Test Aracı ile JavaScript düzenli ifadeleri nasıl test edilir: bayraklar, gruplar, değiştirme sözdizimi, yavaş desenler ve yaygın hatalar.
Düzenli ifadelerin temelleri
Bir düzenli ifade, bir dizi metni derli toplu bir sözdizimiyle tarif eder: düz karakterler, karakter sınıfları, niceleyiciler ve gruplar. Motor girdiyi tarar ve desenin nerelerde eşleştiğini bildirir. XGM'nin test aracı tarayıcınızın JavaScript motorunu kullanır; bu yüzden sonuçlar, kodunuzdaki String.prototype.match, matchAll ve replace çağrılarının yaptığıyla birebir örtüşür. Aynı deseni tarayıcı konsolunda denemekle bu sayfada denemek arasında bir fark yoktur, ama araç eşleşmeleri ve grupları okunur biçimde gösterir. Eşleşmeleri gözle görmek, bir deseni kafada canlandırmaya çalışmaktan hem daha hızlı hem daha güvenilirdir.
| Sözdizimi | Anlamı | Örnek |
|---|---|---|
. | Satır sonları dışında herhangi bir karakter (s yoksa) | a.c ifadesi abc ile eşleşir |
\d, \w, \s | Rakam, sözcük karakteri, boşluk | \d{4} ifadesi 2026 ile eşleşir |
[abc], [^abc] | Karakterlerden biri ya da hiçbiri | [aeiou] |
*, +, ? | 0 veya daha fazla, 1 veya daha fazla, 0 veya 1 | colou?r |
{n,m} | n ile m arasında tekrar | \d{2,4} |
^, $ | Girdinin başı ve sonu (m ile satırın başı ve sonu) | ^Error |
\b | Sözcük sınırı | \bcat\b |
( ), (?<name> ) | Yakalama grubu, adlandırılmış grup | (?<year>\d{4}) |
(?: ) | Yakalamayan grup | (?:https?|ftp):// |
a|b | Seçenekler | jpg|png |
(?= ), (?! ) | İleri bakış, olumsuz ileri bakış | \d+(?=px) |
Regex Test Aracı nasıl kullanılır
- Regex Test Aracını açın ve deseni çevresindeki eğik çizgiler olmadan girin, örneğin
(?<year>\d{4})-(?<month>\d{2}). g,iya damgibi bayrakları ayarlayın.- Test metnini yapıştırın. Eşleşmeler vurgulanır ve grupları ile birlikte listelenir.
- Sonucu önizlemek için Değiştir seçeneğini açın ve
$1,$<name>ya da$&kullanarak bir değiştirme metni girin.
Pratik bir örnek: bir günlük dosyasında example.com altındaki sunucu adlarını bulmak için \b[a-z0-9-]+\.example\.com\b deseni gi bayraklarıyla www.example.com ve API.example.com ile eşleşir, ama example.com.evil.example.net ile eşleşmez; bunu sağlayan, com sonrasındaki sözcük sınırıdır. Hangi satırların neden eşleştiğini görmek için varyasyonları test aracında deneyin. Sözcük sınırını kaldırıp sonucun nasıl değiştiğine bakmak, kuralın ne işe yaradığını anlatmanın en hızlı yoludur.
Desenle birlikte bir test satırları kümesi saklayın; örneğin kodun yanındaki bir yorum satırında. Biri deseni ileride değiştirdiğinde, o satırları test aracına yapıştırmak davranışın değişip değişmediğini anında gösterir. Bu küçük alışkanlık, düzenli ifadelerin bakımını tahmin işi olmaktan çıkarır. Satır sayısı az olsa bile her birinin neden orada olduğunu kısa bir notla yazmak, ileride ciddi zaman kazandırır.
Eşleşmemesi gereken durumlar da dahil olmak üzere gerçekçi metinlerle test edin. Geçerli her tarihi bulan bir desen, 2026-13-45 gibi bir değeri ya da benzer görünen bir telefon numarasını da reddettiğini doğrulayana kadar yarım kalmış sayılır. Yanlış pozitifler çoğu zaman eksik eşleşmelerden daha pahalıya mal olur, çünkü sessizce yanlış veri üretirler. Eşleşmesi gereken ama alışılmadık görünen örnekleri de aynı listeye ekleyin.
Bayraklar
| Bayrak | Adı | Etkisi |
|---|---|---|
g | Global | İlk eşleşme yerine tüm eşleşmeleri bulur |
i | Ignore case | Büyük/küçük harf farkını yok sayar |
m | Multiline | ^ ve $ satır başlarında ve sonlarında eşleşir |
s | dotAll | . satır sonlarıyla da eşleşir |
u | Unicode | Unicode kod noktaları ve \p{…} özellik kaçışları |
v | Unicode sets | u gibi, ek olarak sınıflarda küme işlemleri; u ile birlikte kullanılmaz |
y | Sticky | Yalnızca geçerli konumda eşleşir (lastIndex) |
d | Indices | Grupların başlangıç ve bitiş indislerini bildirir |
u bayrağı ASCII dışındaki her şey için önemlidir. Bu bayrak olmadan bir emoji iki ayrı kod birimi sayılır ve "herhangi bir harf" anlamına gelen \p{L} kullanılamaz. u ile birlikte \p{L}+ her yazı sistemindeki sözcüklerle, örneğin Ștefan ya da Zürich ile eşleşir. Türkçe metinlerde de fark burada ortaya çıkar: noktasız ı ve şapkalı harfler \w kapsamına girmez, ama \p{L} kapsamına girer. Bayrakları sonradan eklemek desenin anlamını değiştirebileceği için, testi baştan doğru bayraklarla yapın.
Değiştirme sözdizimi
| Kalıp | Eklediği |
|---|---|
$& | Eşleşmenin tamamı |
$1, $2, … | Numaralı grup |
$<name> | Adlandırılmış grup |
$$ | Düz bir dolar işareti |
$' | Eşleşmeden sonraki metin (dolar işaretinin ardından ters tırnak ise öncesindeki metni ekler) |
Pattern: (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
Flags: g
Replacement: $<day>.$<month>.$<year>
Input: Released 2026-09-15, patched 2026-10-01
Output: Released 15.09.2026, patched 01.10.2026Yavaş desenler ve felaket geri izleme
JavaScript'in regex motoru geri izlemeye dayanır: desenin bir parçası başarısız olduğunda geri döner ve eşleşmenin başka yollarını dener. Çakışan karakterler üzerinde iç içe geçmiş niceleyiciler, örneğin (a+)+$ ya da (\w|\d)*x, deneme sayısının girdi uzunluğuyla üstel biçimde büyümesine yol açabilir. Birkaç düzine karakter o noktada saniyeler, hatta daha uzun sürebilir. Sorunun sinsi yanı, kısa test verileriyle her şeyin hızlı görünmesidir.
Bu, ReDoS (düzenli ifadelerle hizmet reddi) adı verilen gerçek bir güvenlik sorunudur: böyle bir deseni kullanıcı girdisi üzerinde çalıştıran bir sunucu, özel olarak hazırlanmış tek bir istekle kilitlenebilir. Test aracı desenleri bir web işçisinde çalıştırır ve 1,5 saniye sonra durdurur; böylece donmuş bir sekme yerine "1,5 saniye sonra durduruldu" iletisini görürsünüz. Bir desen bu sınıra takılıyorsa, aynı desen sunucunuzda da bir risktir. Böyle bir deseni olduğu gibi bırakmak yerine daha dar bir karakter sınıfıyla yeniden yazın.
| Riskli | Daha güvenli | Neden |
|---|---|---|
(a+)+ | a+ | Aynı karakterler üzerinde iç içe geçmiş niceleyiciler |
(\w|\d)* | \w* | \d zaten \w içinde olduğundan seçenekler çakışıyor |
.*.*= | [^=]*= | İki açgözlü joker aynı metin için yarışıyor |
^(\s*\w+\s*)+$ | ^\s*\w+(?:\s+\w+)*\s*$ | Tekrarlar arasındaki ayırıcıları zorunlu kılın |
Sunucularda girdiyi sınırlayın
Yaygın hatalar
- Kaçış koymayı unutmak.
.herhangi bir karakterle eşleşir; düz bir nokta için, örneğinexample\.comifadesinde\.kullanın. - Sabitlenmemiş doğrulama.
\d{5}deseni123456içinde de eşleşir; bir değerin tamamını doğrulamak için^\d{5}$kullanın. - Açgözlü jokerler.
<.*>deseni satırdaki ilk<işaretinden son>işaretine kadar eşleşir;<[^>]*>ya da tembel<.*?>kullanın. - Kodda iki kez kaçış. JavaScript'te dize olarak yazılan bir desen çift ters eğik çizgi ister (
"\\d"); test aracı ise regex sabitindeki biçimi bekler (\d). - Döngüde `test()` ile `g` kullanmak. Global bayrak
lastIndexdeğerini çağrılar arasında korur; bu yüzden aynı regex üzerinde art arda yapılantestçağrıları sırayla doğru ve yanlış döndürür.
URL'ler için URL ve UTM aracı bir adresi parçalarına bir desenden çok daha güvenilir biçimde ayırır. Veri biçimleri için JSON Araçları yapıyı gerçekten doğrular. Genel kural şudur: bir biçimin resmi bir dilbilgisi varsa, onu ayrıştırıcıyla okuyun ve düzenli ifadeyi yalnızca metin içinde arama yapmak için saklayın. Bir deseni üretime almadan önce tek satırlık bir yorumla açıklayın; altı ay sonra o yorum, deseni yeniden çözmekten çok daha hızlı okunur.
SSS
Araç hangi regex lehçesini kullanıyor?
JavaScript'i, tarayıcınızın gerçekleştirdiği biçimiyle kullanır. Sonuçlar, aynı desenin o tarayıcıdaki JavaScript kodunda verdiği sonuçla örtüşür.
Python ya da PCRE'den gelen desenim neden çalışmıyor?
Lehçeler birbirinden farklıdır. JavaScript'te sahiplenici niceleyiciler ve atomik gruplar yoktur, (?i) gibi satır içi değiştiriciler çoğu tarayıcıda desteklenmez ve bazı kaçış dizileri farklı davranır.
Testim neden 1,5 saniye sonra durduruldu?
Desen girdi üzerinde fazla geri izleme yaptı; bu da felaket geri izlemenin işaretidir. İç içe geçmiş ya da birbiriyle çakışan niceleyicileri sadeleştirin.
Satırlar arasında nasıl eşleşme yaparım?
. karakterinin satır sonlarıyla eşleşmesi için s bayrağını ya da [\s\S] kalıbını kullanın. ^ ve $ her satırda eşleşsin istiyorsanız m bayrağını ekleyin.
$1 ile $<name> arasındaki fark nedir?
$1 bir gruba konumuna göre atıfta bulunur; $<name> ise adlandırılmış bir gruba atıfta bulunur ve desene yeni gruplar eklediğinizde çalışmayı sürdürür.
Test metnim yükleniyor mu?
Hayır. Desen ve metin tarayıcınızda, sayfanın bir işçi iş parçacığında işlenir.
Regex e-posta adreslerini doğrulayabilir mi?
Yalnızca yaklaşık olarak. Adres sözdiziminin tamamı karmaşıktır; pratikte işe yarayan yol, basit bir desenle birlikte bir doğrulama e-postası göndermektir.
d bayrağı ne yapar?
Eşleşme sonuçlarına her yakalama grubunun başlangıç ve bitiş indislerini ekler; bu da vurgulama yapmak ya da düzenleyici yazmak için kullanışlıdır.
HTML ayrıştırmak için regex kullanmalı mıyım?
Basit ve içeriği bilinen parçaların ötesinde hayır. HTML'in iç içe geçmesi ve isteğe bağlı sözdizimi desenleri kırılgan yapar; tarayıcının DOM ayrıştırıcısını ya da düzgün bir HTML ayrıştırma kitaplığını kullanın.
\w neden aksanlı harflerle eşleşmiyor?
\w ASCII harfleri, rakamlar ve alt çizgi demektir. Her yazı sistemindeki harfler için u bayrağıyla birlikte \p{L} kullanın.