Her Geliştiricinin Kaydetmesi Gereken Yaygın Regex Kalıpları

Karanlık düzenleyici arka planında sözdizimi vurgulamalı yaygın regex kalıpları referansı

Regex pattern'ları, metin içindeki belirli karakter dizilerini eşleştiren yeniden kullanılabilir şablonlardır - neredeyse her programlama dilinde çalışan süper güçlü bir "bul" aracı gibi düşünebilirsin. Bir e-posta adresini doğruluyorsan, formdan telefon numarasını temizliyorsan ya da bir log dosyasını ayrıştırıyorsan, iyi seçilmiş birkaç düzenli ifade ihtiyacının yüzde doksanını karşılar. Bu rehber en pratik pattern'ları bir araya getiriyor, her birinin ne yaptığını açıklıyor ve nasıl uyarlayabileceğini gösteriyor.

Hızlı Regex Sözdizimi Özeti

Pattern'lara geçmeden önce, sürekli karşılaşacağın temel yapı taşlarının kısa bir özeti. Daha önce regex kullandıysan bile bunları tek yerde görmek işine yarar.

Token Anlamı Örnek eşleşme
. Yeni satır hariç herhangi bir karakter a.c eşleşir: abc , a1c
\d Herhangi bir rakam (0-9) \d\d eşleşir: 42
\w Kelime karakteri (harf, rakam, alt çizgi) \w+ eşleşir: hello_world
\s Boşluk karakteri (space, tab, yeni satır) \s+ birden fazla boşlukla eşleşir
^ / $ String'in başı / sonu ^\d+$ yalnızca 123 ile eşleşir
{n,m} n ile m arasında tekrar \d{2,4} eşleşir: 12 ile 1234 arası
[abc] Karakter sınıfı - a, b veya c'den biri [aeiou] herhangi bir sesliyle eşleşir
(?:...) Yakalamayan grup (non-capturing group) Backreference saklamadan gruplar
(?=...) Pozitif lookahead Tüketmeden sonrasını kontrol eder

JavaScript regex sözdizimi için en kapsamlı tek kaynak MDN Web Docs düzenli ifadeler rehberi 'dir. Aşağıdaki pattern'ların büyük çoğunluğu Python, PHP, Java ve Ruby'de de küçük flag farklılıklarıyla doğrudan çalışır.

E-posta Doğrulama

E-posta, regex'in klasik kullanım alanıdır - aynı zamanda geliştiricilerin çok katı olmaya çalışarak en sık hata yaptığı yerdir. RFC 5322 spesifikasyonu teknik olarak "very unusual"@example.com gibi adreslere izin verir; bunları neredeyse hiçbir regex doğru işleyemez. Gerçek dünya giriş doğrulamasının yüzde doksan dokuzu için pragmatik bir pattern yeterlidir:

^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$

Her parçanın işlevi:

  • [a-zA-Z0-9._%+\-]+ - yerel kısım (@ işaretinden önce); nokta, artı, tire ve alt çizgiye izin verir
  • @ - gerçek @ işareti
  • [a-zA-Z0-9.\-]+ - alt alan adları dahil domain adı
  • \.[a-zA-Z]{2,} - en az 2 karakter uzunluğunda TLD (.io, .com, .museum)
Regex tek başına bir e-posta adresinin gerçekten var olduğunu veya ulaşılabilir olduğunu doğrulayamaz. Önemli işlemler için her zaman onay e-postası gönder.

URL ve Web Adresleri

URL pattern eşleştirme; düz metinden bağlantı çıkarmaktan kullanıcının girdiği web sitesi alanını doğrulamaya kadar pek çok senaryoyu kapsar.

https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*)
  • https? - hem http hem de https ile eşleşir
  • (?:www\.)? - isteğe bağlı www öneki
  • [-a-zA-Z0-9@:%._+~#=]{1,256} - maksimum 256 karakter uzunluğunda hostname karakterleri
  • \.[a-zA-Z0-9()]{1,6} - TLD
  • \b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*) - isteğe bağlı path, query string ve fragment

Yalnızca doğrulama yapacaksan (çıkarma değil), pattern'ı ^ ve $ anchor'larıyla sar.

Telefon Numaraları

Telefon numaraları ülkeye ve kullanıcı alışkanlığına göre büyük farklılıklar gösterdiğinden oldukça karmaşık bir alan. İki pattern çoğu senaryoyu karşılar:

ABD/Kanada (NANP) formatı

^(\+1[-.\s]?)?(\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}$

Eşleşir: 555-867-5309 , (555) 867 5309 , +1.555.867.5309 , 5558675309

Uluslararası (E.164 formatı)

^\+[1-9]\d{6,14}$

E.164, Twilio ve AWS SNS gibi çoğu telefoni API'sinin kullandığı formattır. + ile başlar ve ülke kodu içerir; boşluk veya noktalama işareti bulunmaz.

Temel format kontrolünün ötesinde - örneğin belirli bir ülkede numaranın gerçekten geçerli bir mobil hat olup olmadığını doğrulamak için - libphonenumber (Google'ın Java, JavaScript, Python ve daha fazlasında kullanılabilen açık kaynaklı telefon numarası kütüphanesi) gibi özel bir kütüphane kullan.

Tarih ve Saat

Tarih pattern eşleştirme; log ayrıştırıcılarda, form doğrulayıcılarda ve veri pipeline'larında sıkça karşına çıkar. Hedef format, giriş kaynağına göre değişir.

ISO 8601 (YYYY-MM-DD)

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$

ABD formatı (MM/DD/YYYY)

^(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])\/\d{4}$

24 saatlik zaman (HH:MM veya HH:MM:SS)

^([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?$

Bu pattern'ların yalnızca formatı doğruladığını, takvim mantığını değil, unutma. Örneğin 2024-02-31 (31 Şubat var olmasa da) geçerli sayılır. Katı tarih doğrulaması için regex kontrolünün ardından dilin tarih kütüphanesiyle ayrıştır.

Parola Güvenliği Doğrulaması

Parola kuralları genellikle farklı karakter türlerinin karışımını ve minimum uzunluğu gerektirir. Lookahead'ler, birden fazla ayrı kontrol yazmadan bunu temiz bir şekilde çözmenizi sağlar.

En az 8 karakter, en az bir büyük harf, bir küçük harf, bir rakam

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$

Güçlü: 8+ karakter, büyük harf, küçük harf, rakam ve özel karakter

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{8,}$

Her (?=.*[...]) , tüm string'i en az bir eşleşen karakter için tarayan bir lookahead'dir. Sondaki .{8,} minimum uzunluğu zorunlu kılar. {8,} yerine {12,} kullanarak 12 karakterlik minimum zorunluluğu uygulayabilirsin; bu NIST SP 800-63B kılavuzuyla örtüşür.

IP Adresleri

IPv4

^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$

Bu pattern, her oktet'i 0-255 aralığında açıkça eşleştirerek 999.0.0.1 gibi geçersiz değerleri doğru biçimde reddeder.

IPv6 (basitleştirilmiş)

^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$

Bu pattern tam 8 gruplu formatı destekler. Sıkıştırılmış notasyon için (örneğin loopback adresi ::1 ), pattern önemli ölçüde karmaşıklaşır - bu noktada regex yerine bir ağ kütüphanesiyle ayrıştırmak çok daha güvenilirdir.

HTML ve Markup

Burada birkaç hedefli pattern gerçekten işe yarar. "HTML'i regex ile ayrıştırma" genel tavsiyesi tam belgeler için hala geçerlidir - bunun için BeautifulSoup veya DOMParser gibi uygun bir DOM ayrıştırıcı kullan. Ancak belirli ve sınırlı görevler için regex gayet iyi çalışır.

Tüm HTML etiketlerini temizle

<[^>]*>

Belirli bir etiketten içerik çıkar (örneğin <title>)

([^<]*)<\/title>

1. yakalama grubu başlık metnini içerir.

HTML hex renk kodlarını eşleştir

#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})\b

Hem 3 haneli kısaltma ( #fff ) hem de 6 haneli tam form ( #ffffff ) ile eşleşir.

Günlük Kullanım Pattern'ları

Bunlar farklı proje türlerinde sürekli karşına çıkan pattern'lardır.

Slug (URL dostu string)

^[a-z0-9]+(?:-[a-z0-9]+)*$

my-blog-post-2024 gibi string'lerle eşleşir. Büyük harf yok, baş veya sondaki tire yok, çift tire yok.

Kredi kartı numarası (temel format, boşluksuz)

^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$
  • 4 ile başlar - Visa (13 veya 16 hane)
  • 51-55 ile başlar - Mastercard (16 hane)
  • 34 veya 37 ile başlar - Amex (15 hane)
  • 6011 veya 65 ile başlar - Discover (16 hane)
Ham kart numaralarını asla saklama. Bu pattern yalnızca istemci tarafında format geri bildirimi içindir. Gerçek kart doğrulaması Stripe veya Braintree gibi PCI uyumlu bir işlemci üzerinden yapılmalıdır.

Boşluk normalleştirme (birden fazla boşluğu daralt)

\s{2,}

Eşleşmeleri tek bir boşlukla değiştirerek dağınık kullanıcı girdisini veya scrape edilmiş metni temizle.

Yalnızca rakamlar

^\d+$

Yalnızca alfanümerik karakterler

^[a-zA-Z0-9]+$

Belirli bir kelime içeren satırı eşleştir (flag ile büyük/küçük harf duyarsız)

^.*\bword\b.*$

\b kelime sınırı, word kelimesinin password içinde eşleşmesini engeller.

Versiyon numaralarını çıkar (semver)

\bv?(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.]+))?(?:\+([a-zA-Z0-9.]+))?\b

v2.14.0-beta.1+build.42 gibi string'lerden major, minor, patch, pre-release etiketi ve build metadata'yı yakalar.

Flag'ler ve Pratik İpuçları

Regex pattern'ları, hangi flag'leri uyguladığına bağlı olarak farklı davranır. En sık ihtiyaç duyulanlar:

Flag JS Python Etkisi
Büyük/küçük harf duyarsız i re.IGNORECASE Büyük ve küçük harfleri eşit kabul eder
Global (tümünü bul) g re.findall() Yalnızca ilk eşleşme yerine tüm eşleşmeleri döndürür
Çok satırlı (multiline) m re.MULTILINE ^ ve $ string sınırları yerine satır sınırlarıyla eşleşir
Dotall s re.DOTALL . yeni satır karakterleriyle de eşleşir

Hata ayıklama süresini kısaltacak birkaç alışkanlık:

  • Her zaman uç durumlarla test et - boş string, maksimum uzunluk, Unicode karakterler ve neredeyse geçerli ama tam değil olan string'ler.
  • Non-capturing group kullan (?:...) eşleşen içeriğe ihtiyaç duymadığında - capturing group'lardan daha hızlı ve temizdir.
  • Doğrulama pattern'larını anchor'la ^ ve $ ile; böylece geçersiz bir string içindeki geçerli görünümlü bir alt dize gözden kaçmaz.
  • Felaket geri izlemesine (catastrophic backtracking) dikkat et - (a+)+ gibi iç içe quantifier'lar, özel hazırlanmış girdilerde regex motorunu kilitleyebilir. Quantifier'ları sade ve spesifik tut.
  • Pattern oluştururken bir regex test aracı kullan. regex101.com canlı eşleşme dökümü gösterir, her token'ı açıklar ve PCRE, JavaScript, Python ile diğer türler arasında geçiş yapmanı sağlar.
Regex pattern eşleştirme ve giriş doğrulama araçları

Regex pattern'larını tahmin yürütmeden test et ve doğrula

Giriş doğrulaması için güvenilir regex pattern'ları oluşturmak, doğru araçlar elinizin altındayken çok daha hızlı olur. Regex pattern'ları ve daha fazlasıyla metni temizlemek, kontrol etmek ve dönüştürmek için ücretsiz geliştirici araçlarımızı keşfet.

Ücretsiz Araçları Dene →

Greedy quantifier'lar (örneğin .* ) olabildiğince çok eşleşir ve ardından geri izler. Lazy quantifier'lar (örneğin .*? ) olabildiğince az eşleşir. Örneğin bold string'ine karşı <.*> pattern'ı tüm string'i eşleştirirken, <.*?> yalnızca ile eşleşir. Sınırlayıcılar arasındaki içeriği çıkarırken lazy quantifier kullan.

Büyük ölçüde evet, ancak farklılıklar var. Python'un re modülü PCRE tarzı sözdizimi kullanır ve (?P...) ile adlandırılmış grupları destekler. JavaScript biraz farklı flag sözdizimi kullanır ve eski motorlarda (ES2018 öncesi) lookbehind desteği yoktur. Diller arası çalışma için ortak kesişim kümesine bağlı kal: karakter sınıfları, quantifier'lar, anchor'lar ve temel gruplar.

Regex, production ortamında format doğrulaması için uygundur - neredeyse her web framework'ünde kullanılır. Asıl risk, catastrophic backtracking yoluyla ReDoS (regex hizmet reddi) saldırılarına açık kapı bırakan kötü yazılmış pattern'lardır. İç içe quantifier'lardan kaçın, pattern'ları spesifik tut ve regex çalışmadan önce her zaman makul bir giriş uzunluğu sınırı belirle.

Çoğu yaygın motorda ASCII girdi için ikisi eşdeğerdir. Fark Unicode'da ortaya çıkar: \d bazı motorlarda (Unicode moduyla Python 3 gibi) Arap-Hint rakamları gibi diğer yazı sistemlerindeki rakamlarla da eşleşir. Kesinlikle ASCII 0-9 rakamları istiyorsan, açık olmak için [0-9] kullan. Çoğu web formu doğrulamasında bu ayrım önemli değildir.

İki şeye ihtiyacın var: dotall flag ( . 'nin yeni satırlarla eşleşmesi için) ve muhtemelen multiline flag ( ^ ve $ 'nin tüm string yerine her satıra anchor'lanması için). JavaScript'te /pattern/ms kullan. Python'da re.DOTALL | re.MULTILINE 'yi birleştir. Dotall olmadan . satır sonlarında durur ve pattern satırları kapsamaz.