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.
İçindekiler
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)
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?- hemhttphem dehttpsile 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.
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})$
-
4ile başlar - Visa (13 veya 16 hane) -
51-55ile başlar - Mastercard (16 hane) -
34veya37ile başlar - Amex (15 hane) -
6011veya65ile başlar - Discover (16 hane)
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'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.