Düzenli ifadeler (regular expressions, kısaca regex), metin içinde belirli bir kalıba uyan parçaları tarif etmenin standart yoludur. Bir formdaki telefon numarasının doğru biçimde girilip girilmediğini kontrol etmek, binlerce satırlık bir log dosyasından IP adreslerini ayıklamak veya bir metindeki tüm tarihleri başka biçime çevirmek regex ile birkaç karakterle yapılabilir. İlk bakışta karmaşık görünse de birkaç temel yapı taşını öğrenmek çoğu iş için yeterlidir. Örnekleri denemek için regex test aracımızı kullanabilirsiniz.
Temel yapı taşları
Karakterler ve karakter sınıfları
| İfade | Anlamı | Örnek eşleşme |
|---|---|---|
abc |
Tam olarak “abc” | abc |
. |
Satır sonu dışında herhangi bir karakter | a, 5, ? |
[abc] |
a, b veya c | b |
[^abc] |
a, b, c dışındaki karakter | x |
[a-z] |
a ile z arasındaki küçük harf | k |
\d |
Rakam (0–9) | 7 |
\w |
Harf, rakam veya alt çizgi (genellikle yalnızca İngilizce harfler) | a, 3, _ |
\s |
Boşluk, sekme, satır sonu | “ “ |
\D, \W, \S |
Yukarıdakilerin tersi |
Özel anlamı olan karakterleri (. * + ? ( ) [ ] { } ^ $ | \) harfiyen aramak için önüne ters bölü koyun: \. gerçek bir nokta arar.
Niceleyiciler
| İfade | Anlamı |
|---|---|
* |
0 veya daha fazla |
+ |
1 veya daha fazla |
? |
0 veya 1 (isteğe bağlı) |
{3} |
Tam 3 kez |
{2,4} |
2 ile 4 arası |
{2,} |
En az 2 |
Çapalar ve sınırlar
| İfade | Anlamı |
|---|---|
^ |
Satırın/metnin başı |
$ |
Satırın/metnin sonu |
\b |
Kelime sınırı |
Doğrulama yaparken kalıbı ^ ve $ arasına almak çok önemlidir; aksi halde \d{5} ifadesi “abc123456xyz” içinde de eşleşme bulur.
Gruplar ve alternatifler
(abc)→ yakalayan grup; eşleşen parçayı daha sonra kullanmanızı sağlar.(?:abc)→ yakalamayan grup; yalnızca gruplamak için.(?<yil>\d{4})→ adlandırılmış grup.kedi|köpek→ “kedi” veya “köpek”.
Bayraklar (flags)
| Bayrak | Anlamı |
|---|---|
g |
Global: tüm eşleşmeleri bul, ilkinde durma |
i |
Büyük-küçük harf duyarsız |
m |
Çok satırlı: ^ ve $ her satırın başı ve sonu olur |
s |
. satır sonunu da eşleştirir |
u |
Unicode modu (JavaScript); \p{L} gibi ifadeleri etkinleştirir |
Türkiye’ye özgü pratik örnekler
Cep telefonu numarası
^(?:\+90|0)?5\d{9}$
“05321234567”, “+905321234567” ve “5321234567” biçimlerini kabul eder. Kullanıcılar boşluk ve tire de girebileceği için doğrulamadan önce bunları silmek pratik bir yaklaşımdır.
T.C. kimlik numarası (yalnızca biçim)
^[1-9]\d{10}$
11 haneli ve sıfırla başlamayan sayıları kabul eder. Kimlik numarasının son iki hanesi bir algoritmayla hesaplandığı için gerçek doğrulama regex ile değil, bu algoritmayla yapılır; bunun için T.C. kimlik no doğrulama aracını kullanabilirsiniz.
Posta kodu
^(0[1-9]|[1-7]\d|8[01])\d{3}$
Türkiye’de posta kodları 5 hanelidir ve ilk iki hane il plaka koduna (01–81) karşılık gelir.
Tarih (GG.AA.YYYY)
^(0[1-9]|[12]\d|3[01])\.(0[1-9]|1[0-2])\.(19|20)\d{2}$
“08.10.2026” gibi tarihleri kabul eder. 31.02.2026 gibi takvimde olmayan tarihleri ayırt edemez; o kontrolü kodda yapın.
Basit e-posta kontrolü
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Boşluk içermeyen, tek @ işaretli ve noktalı bir alan adı olan adresleri kabul eder. Kesin doğrulama için onay e-postası gönderin.
IBAN biçimi
^TR\d{24}$
Boşluklar silindikten sonra TR ile başlayan 26 karakterlik biçimi kontrol eder. Kontrol basamaklarının doğruluğu ayrıca hesaplanmalıdır; ayrıntılar IBAN rehberimizde.
Türkçe karakterler ve büyük-küçük harf sorunu
\wve[a-z]Türkçe harfleri (ç, ğ, ı, ö, ş, ü) kapsamaz. Açıkça yazın:[a-zçğıöşü].- Unicode destekli motorlarda
\p{L}tüm dillerdeki harfleri kapsar (JavaScript’teubayrağıyla). ibayrağı büyük-küçük harf eşleştirmesini genellikle İngilizce kurallarına göre yapar: İ ile i ve I ile ı eşleşmesi beklediğiniz gibi çalışmayabilir. Türkçe metinlerde iki biçimi de sınıfa eklemek en güvenli yoldur:[iİ],[ıI].
Açgözlü ve tembel eşleşme
Metin: <b>kalın</b> ve <b>yine kalın</b>
<b>.*</b>→ açgözlü; ilk<b>’den son</b>’ye kadar her şeyi alır.<b>.*?</b>→ tembel; her<b>…</b>çiftini ayrı ayrı eşleştirir.
Bununla birlikte, HTML gibi iç içe yapıları regex ile ayrıştırmak kırılgandır; ciddi işler için bir HTML ayrıştırıcı kullanın.
Bul ve değiştir örneği
Tarihleri “GG.AA.YYYY” biçiminden “YYYY-AA-GG” biçimine çevirmek:
'08.10.2026'.replace(/(\d{2})\.(\d{2})\.(\d{4})/, '$3-$2-$1');
// '2026-10-08'
Aynı mantık VS Code, Notepad++ ve çoğu editörün “regex ile bul-değiştir” özelliğinde de çalışır. URL yönlendirme kurallarında regex kullanımına 301-302 yönlendirme rehberimizde değindik.
Regex’i adım adım yazmak
Karmaşık bir kalıbı tek seferde yazmaya çalışmak yerine parça parça ilerleyin:
- Eşleşmesi gereken ve eşleşmemesi gereken örneklerden bir liste hazırlayın.
- En basit kalıpla başlayın (
\d+), ardından kısıtları ekleyin (^\d{5}$). - Her adımda test aracında tüm örnekleri deneyin.
- Kalıp tamamlandığında, yanına ne yaptığını açıklayan kısa bir yorum ekleyin.
Bu yaklaşım hem hataları erken yakalar hem de kalıbı daha sonra okuyacak kişinin işini kolaylaştırır. Metin listelerinde tekrar eden satırları silmek veya sıralamak gibi basit işler için regex yazmak yerine satır sıralama ve tekrar silme aracını kullanmak daha hızlı olabilir.
Sık yapılan hatalar
- Çapaları unutmak: Doğrulamada
^...$kullanılmazsa kısmi eşleşme kabul edilir. - Noktayı kaçırmamak:
.her karakteri eşleştirir; gerçek nokta için\.yazın. - Aşırı karmaşık kalıplar: Okunamayan regex bakımı zor ve hatalıdır; gerekirse işi birkaç adıma bölün.
- Felaket geri izleme (catastrophic backtracking):
(a+)+$gibi iç içe niceleyiciler bazı girdilerde motoru kilitleyebilir. - Motor farklarını göz ardı etmek: JavaScript, Python, PCRE ve .NET arasında küçük söz dizimi farkları vardır.