İçeriğe geç
LeedyBox
Destek ol

Düzenli İfadelerin Temelleri

Düzenli ifade (regex), metni tanımlayan bir desendir. Bu rehber en sık kullanacağınız yapı taşlarını ve yavaş ya da şaşırtıcı eşleşmelere yol açan tuzakları ele alır.

Düz Karakterler ve Karakter Sınıfları

Çoğu karakter kendisiyle eşleşir: cat deseni "cat" metnini bulur. Bazı karakterlerin özel anlamı vardır; örneğin . * + ? ( ) [ ] { } ^ $ | \. Bunlardan birini olduğu gibi eşleştirmek için önüne ters eğik çizgi koyarak kaçışlayın; örneğin nokta için \..

Bir karakter sınıfı, bir kümedeki tek bir karakterle eşleşir. [abc] a, b veya c ile; [a-z] küçük bir ASCII harfiyle; [^0-9] rakam olmayan herhangi bir karakterle eşleşir. Yaygın kısaltmalar \d (rakam), \w (harf, rakam veya alt çizgi), \s (boşluk karakteri) ve bunların tersleri olan \D, \W ve \S'dir. Nokta . satır sonu dışındaki herhangi bir karakterle eşleşir.

JavaScript'te \w ve \d yalnızca ASCII karakterleri kapsar. Herhangi bir dildeki harfleri eşleştirmek için u bayrağıyla birlikte \p{L} gibi bir Unicode özelliği kullanın.

Niceleyiciler ve Çapalar

Niceleyiciler, önceki öğenin kaç kez tekrarlanabileceğini belirtir:

Sözdizimi Anlamı Örnek
* 0 veya daha fazla ab*; a, ab, abbb ile eşleşir
+ 1 veya daha fazla \d+; 7 veya 2026 ile eşleşir
? 0 veya 1 colou?r; color ve colour ile eşleşir
{n,m} n ile m arasında \d{2,4}; 2 ila 4 rakamla eşleşir

Çapalar bir karakterle değil, bir konumla eşleşir. ^ girdinin başı, $ ise sonudur (m bayrağıyla her satırın başı ve sonu). \b bir sözcük sınırıdır; bu nedenle \bcat\b "cat" sözcüğünü bulur ama "concatenate" içinde eşleşmez. Bir değerin tamamını doğrularken iki ucu da çapalayın: ^\d{5}$ tam olarak beş rakamı kabul eder, başka hiçbir şeyi kabul etmez.

Gruplar ve Yakalamalar

Parantezler, bir niceleyicinin veya alternatifin uygulanabilmesi için desenin bir bölümünü gruplar: (ab)+ "ab"yi tekrarlar, (jpg|png) ise iki sözcükten biriyle eşleşir. Normal bir grup eşleşen metni ayrıca yakalar; bu metni bir değiştirme işleminde $1, $2 vb. olarak yeniden kullanabilirsiniz.

(?<year>\d{4}) gibi adlandırılmış gruplar desenleri daha okunur kılar ve $<year> olarak başvurulabilir. Yalnızca gruplamaya ihtiyacınız varsa yakalamayan grup (?:...) kullanılmayan bir yakalama oluşmasını önler. LeedyBox RegEx Test Aracı her eşleşmeyi yakalama gruplarıyla birlikte listeler ve değiştirmeleri önizler.

Bayraklar

Bayraklar desenin tamamının davranışını değiştirir. Yaygın JavaScript bayrakları şunlardır:

  • g (global): yalnızca ilk eşleşmeyi değil, tüm eşleşmeleri bulur.
  • i (ignore case): büyük ve küçük harfleri eşit kabul eder.
  • m (multiline): ^ ve $ her satır sonunda eşleşir.
  • s (dotAll): . satır sonlarıyla da eşleşir.
  • u (unicode): Unicode'a duyarlı eşleştirmeyi ve \p{...} sınıflarını etkinleştirir.

JavaScript'te ayrıca y (sticky) ve d (eşleşme indisleri) bayrakları da vardır; test aracı bunları da destekler.

Açgözlü ve Tembel Eşleştirme, Yıkıcı Geri İzleme

Niceleyiciler varsayılan olarak açgözlüdür: mümkün olduğunca fazla karakterle eşleşir, desenin geri kalanı başarısız olursa karakterleri geri bırakır. <b>bold</b> metninde <.+> deseni dizenin tamamıyla eşleşir. ? eklemek niceleyiciyi tembel yapar; böylece <.+?> yalnızca <b> ile eşleşir. <[^>]+> gibi olumsuzlanmış bir sınıf çoğu zaman daha anlaşılır ve daha hızlıdır.

JavaScript'inki dahil çoğu regex motoru geri izleme kullanır. (a+)+$ gibi iç içe niceleyiciler veya örtüşen alternatifler, bir eşleşme başarısız olduğunda motorun çok sayıda kombinasyonu denemesine yol açabilir; bu da bir sayfayı veya sunucuyu kilitleyebilir. Buna yıkıcı geri izleme (catastrophic backtracking) denir ve güvenilmeyen girdilerle hizmet reddi saldırıları (ReDoS) için kullanılabilir. Aynı karakterler üzerinde niceleyicileri iç içe kullanmaktan kaçının, .* yerine belirli sınıfları tercih edin ve desenleri eşleşmeyen uzun girdilerle test edin.

Regex Türleri Farklılık Gösterir

Tek bir regex standardı yoktur. JavaScript, Python, Java, .NET, PCRE (PHP'nin kullandığı), Go ve veritabanları birbirinden biraz farklı sözdizimlerini destekler. Geriye bakış, iyelik niceleyicileri, adlandırılmış grup sözdizimi, Unicode sınıfları ve değiştirme sözdizimi farklılık gösterir. Örneğin Go'nun RE2 motoru ileri/geri bakışı ve geri başvuruları desteklemez.

LeedyBox RegEx Test Aracı tarayıcınızın JavaScript motorunu kullanır. Orada çalışan bir desenin başka bir dilde değiştirilmesi gerekebilir; bu nedenle deseni çalışacağı yerde yeniden test edin.

Sık Sorulan Sorular

Desenim neden yalnızca ilk geçtiği yerle eşleşiyor?

g bayrağı olmadan JavaScript ilk eşleşmeden sonra durur. Tüm eşleşmeleri bulmak için g bayrağını etkinleştirin.

Bir regex e-posta adreslerini doğrulayabilir mi?

Bir regex, bir değerin makul göründüğünü kontrol edebilir, ancak adresin var olduğunu doğrulayamaz. Bunu doğrulamanın olağan yolu bir onay e-postası göndermektir.

^ neden çok satırlı metinde yalnızca bir kez eşleşiyor?

Varsayılan olarak ^ ve $ girdinin tamamını ifade eder. Her satırın başında ve sonunda eşleşmeleri için m bayrağını açın.