Regular expressions (regex) nasil kullanilir: gelistiriciler icin tam rehber

12 dk okuma süresi

Regular expression konusunu sifirdan ogrenin. Temel soz dizimi, karakter siniflari, niceleyiciler, gruplar, lookahead, lookbehind ve e-posta, telefon, URL ile IP icin yaygin desenler. Pratik orneklerle.

Regular expressions nedir ve ne ise yarar

Regular expressions (regex veya regexp), metni son derece hassas bicimde bulmanizi, dogrulamanizi ve donusturmenizi saglayan arama desenleridir. Programlama, sistem yonetimi ve veri isleme alanlarinda temel araclar arasindadir.

Bir regular expression aslinda bir arama desenini tanimlayan karakter dizisidir. Tek bir regex satiri ile baska durumda onlarca kosullu kod satiri gerektirecek isi yapabilirsiniz.

Regex'in yaygin kullanim alanlari:

  • Veri dogrulama: Bir e-posta, telefon numarasi, URL veya posta kodunun dogru bicimde olup olmadigini kontrol etmek
  • Ara ve degistir: Uzun metinlerde kaliplari bulup degistirmek (metin editorleri ve IDE'lerde oldugu gibi)
  • Veri cikarma: Yapilandirilmamis metinden belirli bilgileri cekmek (web scraping, loglar)
  • Log ayrisma: Sunucu ve uygulama log dosyalarini analiz etmek
  • Linting ve bicimleme: Kodun belirli kurallara uyup uymadigini denetlemek
  • Web framework routing: Express, Django, Rails gibi araclarda URL desenleri tanimlamak

Regex, neredeyse tum programlama dillerinde bulunur: JavaScript, Python, Java, C#, PHP, Ruby, Go, Rust ve digerleri. Ayrica grep, sed ve awk gibi komut satiri araclarinda da kullanilir.

Bu rehberi okurken pratik yapmak isterseniz, baska bir sekmede regex test aracimizi acin.

Temel soz dizimi: literal karakterler ve metakarakterler

Regex soz dizimi iki karakter turune ayrilir: literal karakterler (oldugu gibi eslesenler) ve metakarakterler (ozel anlami olanlar).

Literal karakterler:

Harfler, rakamlar ve sembollerin buyuk kismi literal olarak eslesir. kedi deseni metindeki "kedi" kelimesini bulur.

Temel metakarakterler:

MetakarakterAnlamOrnekEslesme
.Herhangi bir karakter (satir sonu haric)k.ti"kedi", "kiti", "k3ti"
^Satirin/dizenin basi^Merhaba"Merhaba dunya" (yalnizca basta)
$Satirin/dizenin sonudunya$"Merhaba dunya" (yalnizca sonda)
*0 veya daha fazla tekrarab*c"ac", "abc", "abbc", "abbbc"
+1 veya daha fazla tekrarab+c"abc", "abbc" ("ac" degil)
?0 veya 1 tekrar (opsiyonel)colou?r"color", "colour"
|Alternatif (VEYA)kedi|kopek"kedi" ya da "kopek"
\Kacis (siradaki karakteri literal yapar)\.Literal bir nokta

Metakarakterleri kacirma:

Bir metakarakteri literal karakter gibi aramak istiyorsaniz, onune \ koymaniz gerekir. Ornegin:

  • \. literal nokta arar ("herhangi bir karakter" degil)
  • \* literal yildiz arar
  • \? literal soru isareti arar
  • \( ve \) literal parantez arar
  • \\ literal ters slash arar

Pratik ornek: "price: $9.99" dizisini bulmak icin price: \$9\.99 gerekir.

Karakter siniflari ve onceden tanimli siniflar

Karakter siniflari, desendeki belirli bir konumda hangi karakterlerin gecerli oldugunu tanimlamanizi saglar.

Kose parantezlerle ozel siniflar [ ]:

DesenAnlamEslesme ornegi
[abc]Sunlardan biri: a, b veya c"a", "b", "c"
[a-z]Herhangi bir kucuk harf"a", "m", "z"
[A-Z]Herhangi bir buyuk harf"A", "M", "Z"
[0-9]Herhangi bir rakam"0", "5", "9"
[a-zA-Z]Herhangi bir harf"a", "Z", "m"
[a-zA-Z0-9]Herhangi bir alfasayisal karakter"a", "3", "Z"
[^abc]a, b, c disindaki herhangi biri"d", "1", "Z"
[^0-9]Rakam olmayan herhangi biri"a", "!", " "

Onceden tanimli kisaltmalar:

Bunlar yaygin kombinasyonlar icin kisayollardir:

KisaltmaEsdegeriAnlam
\d[0-9]Herhangi bir rakam
\D[^0-9]Rakam olmayan herhangi biri
\w[a-zA-Z0-9_]Kelime karakteri (alfasayisal + alt cizgi)
\W[^a-zA-Z0-9_]Kelime karakteri olmayan
\s[\t\n\r\f\v ]Herhangi bir bosluk karakteri
\S[^\t\n\r\f\v ]Bosluk olmayan herhangi biri
\b(dogrudan esdeger yok)Kelime siniri

Kelime siniri (\b):

\b, tam kelime eslestirmek icin cok kullanislidir. \bkedi\b "kedi"yi bulur ama "kedicik" ya da "sokedi" gibi durumlari bulmaz. Bu, karakter tuketmeyen bir konum capasi gibidir.

Pratik ornek: Bir dizenin sadece harf, rakam ve tire icerdigini dogrulamak icin: ^[a-zA-Z0-9-]+$

Niceleyiciler ve tekrar duzenleyicileri

Niceleyiciler, kendilerinden once gelen ogeyin kac kez gorunmesi gerektigini belirtir.

Temel niceleyiciler:

NiceleyiciAnlamOrnekEslesme
*0 veya daha fazla kez\d*"", "5", "123", "99999"
+1 veya daha fazla kez\d+"5", "123", "99999" (bos degil)
?0 veya 1 kez-?\d+"42", "-42"
{n}Tam olarak n kez\d{4}"2026", "1234" (tam 4 rakam)
{n,}n veya daha fazla kez\d{2,}"12", "123", "1234" (2+ rakam)
{n,m}n ile m arasi\d{2,4}"12", "123", "1234" (2 ila 4 rakam)

Acgozlu ve tembel niceleyiciler:

Varsayilan olarak niceleyiciler acgozlu davranir; yani mumkun olan en uzun eslesmeyi almaya calisir. Sonuna ? eklenirse tembel hale gelir ve en kisa eslesmeyi arar.

  • <.*> metindeki ilk < ile son > arasindaki her seyi yakalayabilir
  • <.*?> ise her HTML etiketini tek tek daha kontrollu bicimde eslestirir

Pratik kullanim:

Bir telefon numarasinin 10 veya 11 rakam oldugunu kontrol etmek icin: ^\d{10,11}$

Bir kullanici adinin 3 ile 16 karakter arasinda oldugunu kontrol etmek icin: ^[a-zA-Z0-9_]{3,16}$

Gruplar, yakalama ve backreference kullanimi

Gruplar, regex'in parcalarini mantiksal olarak bir araya getirir. Bu sayede desenin belirli kisimlarini yakalayabilir, alternatifleri gruplayabilir veya niceleyicileri birden fazla ogeye uygulayabilirsiniz.

Grup turleri:

Soz dizimiTurKullanim amaci
(...)Yakalama grubuEslesen metni hafizada tutar
(?:...)Yakalamayan grupSadece gruplama yapar, hafizada tutmaz
(?<name>...)Isimli grupGruplara isim verir

Yakalama grubu ornegi:

YYYY-MM-DD bicimindeki bir tarihten yil, ay ve gunu cikarmak icin:

(\d{4})-(\d{2})-(\d{2})

  • Grup 1: Yil (ornegin "2026")
  • Grup 2: Ay (ornegin "03")
  • Grup 3: Gun (ornegin "16")

JavaScript'te: "2026-03-16".match(/(\d{4})-(\d{2})-(\d{2})/) ifadesi bir dizi doner; burada [1] "2026", [2] "03", [3] ise "16" olur.

Isimli gruplar:

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

JavaScript'te: match.groups.year, match.groups.month, match.groups.day

Backreference:

Daha once yakalanan metne yeniden basvurmanizi saglar:

  • (\w+)\s+\1 tekrar eden kelimeleri bulur ("ve ve", "bu bu")
  • (['"])(.*?)\1 acilis ve kapanis tirnaklarinin ayni oldugunu garanti ederek tirnak icindeki metni bulur

Gruplar icinde alternatif:

(https?|ftp):// deseni "http://", "https://" veya "ftp://" ile eslesir.

Bu desenleri anlik olarak regex aracimizda deneyebilirsiniz.

Lookahead ve lookbehind: konum assertileri

Lookahead ve lookbehind, mevcut konumun oncesinde veya sonrasinda bir desen bulunup bulunmadigini karakter tuketmeden kontrol eden assertilerdir. Karmaşik dogrulamalarda cok gucludurler.

4 temel assertion turu:

Soz dizimiAdiAnlam
(?=desen)Pozitif lookaheadSonraki kisim desenle eslesmek zorundadir
(?!desen)Negatif lookaheadSonraki kisim desenle eslesmemelidir
(?<=desen)Pozitif lookbehindOnceki kisim desenle eslesmek zorundadir
(?<!desen)Negatif lookbehindOnceki kisim desenle eslesmemelidir

Ornek 1: Guclu sifre dogrulamasi

En az bir buyuk harf, bir kucuk harf, bir rakam ve 8+ karakter isteyen bir sifre icin:

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

  • (?=.*[A-Z]): En az bir buyuk harf olmali
  • (?=.*[a-z]): En az bir kucuk harf olmali
  • (?=.*\d): En az bir rakam olmali
  • .{8,}: Uzunluk en az 8 karakter olmali

Ornek 2: Para birimi sembolu olmadan fiyat bulma

(?<=\$)\d+\.\d{2}

"The price is $29.99 and shipping is $5.00" metninde "$" isaretini degil, "29.99" ve "5.00" kisimlarini yakalar.

Ornek 3: Belirli bir kalipla DEVAM ETMEYEN kelimeleri bulma

\w+(?!\s*:)

Sonrasinda iki nokta bulunmayan kelimeleri bulur. "anahtar: deger" gibi yapi icinde anahtar ile degeri ayirmakta kullanislidir.

Ornek 4: Eksi isaretiyle baslamayan sayilar

(?<!-)\b\d+\b

Negatif sayilari yok sayip sadece pozitifleri bulur. "5 -3 8 -12" icinde "5" ve "8" eslesir.

Uyumluluk notu: Lookbehind her regex motorunda desteklenmez. JavaScript bunu ES2018'den beri destekler. Python, Java, C# ve .NET tam destek sunar. Bazı motorlar lookbehind desenini sabit uzunlukla sinirlar.

Yaygin desenler: e-posta, telefon, URL ve IP

Asagida en yaygin dogrulama ihtiyaclari icin test edilmis desenler yer aliyor. E-posta gibi karmasik formatlarda hicbir regex'in %100 kusursuz olmadigini unutmayin; uretimde sunucu tarafi dogrulama ile tamamlayin.

1. E-posta (pratik dogrulama):

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

  • Local kisim: harfler, rakamlar, nokta, tire, alt cizgi, %, +
  • @: zorunlu ayirici
  • Alan adi: harfler, rakamlar, nokta ve tire
  • TLD: en az 2 harf
  • Gecerli ornekler: user@example.com, first.last@company.co.uk

2. Uluslararasi telefon (E.164):

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

  • Basta istege bagli +
  • Ilk rakam: 1-9 (0 ile baslayamaz)
  • Toplam en fazla 15 rakam
  • Gecerli ornekler: +905551112233, 447911123456

3. URL (HTTP/HTTPS):

^https?:\/\/[\w.-]+(?:\.[a-zA-Z]{2,})(?:\/[\w.~:/?#\[\]@!$&'()*+,;=-]*)?$

  • Protokol: http:// veya https://
  • Alan adi: nokta ve tire icerebilen alfasayisal yapi
  • TLD: en az 2 harf
  • Yol: gecerli URL karakterleri (opsiyonel)

4. IPv4 adresi:

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

  • Nokta ile ayrilmis 4 oktet
  • Her oktet: 0-255
  • Gecerli: 192.168.1.1, 10.0.0.1, 255.255.255.0
  • Reddedilir: 256.1.1.1, 192.168.1.999

5. ISO tarih bicimi (YYYY-MM-DD):

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

  • Yil: 4 rakam
  • Ay: 01-12
  • Gun: 01-31
  • Imkansiz gunleri (02-30 gibi) tek basina dogrulamaz; ek mantik gerekir

6. CSS renk hex degeri:

^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$

  • Desteklenen bicimler: #RGB, #RRGGBB, #RRGGBBAA
  • Gecerli: #fff, #FF5733, #FF573380

Butun bu desenleri regex test aracimizda deneyip iyilestirebilirsiniz. Bu desenleri iceren JSON verilerini kontrol etmek icin JSON dogrulayicimizi da kullanin.

Flag'ler, performans ve iyi uygulamalar

Regex'i iyi kullanmak icin flag'leri (degistiriciler) bilmeli ve performans sorunlariyla bakim maliyetini azaltan iyi uygulamalari benimsemelisiniz.

Yaygin flag'ler:

FlagAdiEtkisi
gGlobalIlk eslesme yerine tum eslesmeleri bulur
iCase insensitiveBuyuk/kucuk harf ayrimini kaldirir
mMultiline^ ve $ her satirin basi/sonu ile eslesir
sDotallNokta . satir sonlarini da kapsar
uUnicodeTam Unicode karakter destegi saglar

JavaScript'te: /pattern/flags - ornek: /hello world/gi

Python'da: re.compile(r'pattern', re.IGNORECASE | re.MULTILINE)

Performans icin iyi uygulamalar:

  • Felaket backtracking'den kacin: (a+)+$ gibi desenler regex motorunu ussel sayida kombinasyon denemeye zorlayabilir. Bu durum ReDoS olarak bilinir. Mumkunse sahiplenici niceleyiciler (++) veya atomik gruplar kullanin
  • Belirgin olun: Sadece harf bekliyorsaniz .+ yerine [a-z]+ yazin. Desen ne kadar net olursa o kadar hizli calisir
  • Capalari kullanin: ^ ve $, motorun nereden baslayip bitecegini belirler ve gereksiz aramayi azaltir
  • Yakalamayan gruplari tercih edin: Sonucu kullanmayacaksaniz (?:...), (...) ifadesinden daha verimlidir
  • Karmasik regex'leri test edin: Uretime almadan once sinir durumlari, bos girdiler ve beklenmeyen karakterlerle deseninizi deneyin

Bakim acisindan iyi uygulamalar:

  • Uzun regex'leri yorumlarla veya parcalara ayirarak belgeleyin
  • Cok karmasik dogrulamalarda tek regex yerine regex + normal kod birlesimini dusunun
  • Mumkunse test dosyalarina pozitif ve negatif ornekler ekleyin

Desenlerinizi guvenli sekilde denemek icin regex test aracimizi, veri yapilarini kontrol etmek icin ise JSON dogrulayicimizi kullanabilirsiniz.

Bu aracı deneyin:

Aracı aç

Sıkça sorulan sorular

Regex ogrenmeye yeni baslayan biri once neye odaklanmali?

Ilk olarak literal karakterleri, karakter siniflarini, capalari (^ ve $) ve temel niceleyicileri (*, +, ?, {n}) ogrenin. Bunlari anladiktan sonra gruplar, backreference ve lookahead/lookbehind gibi ileri konulara gecmek cok daha kolay olur.

Bir regex tum programlama dillerinde ayni sekilde mi calisir?

Hayir. Temel soz dizimi benzer olsa da her regex motorunun kendi farklari vardir. JavaScript, Python, PCRE, Java ve .NET arasinda lookbehind destegi, Unicode isleme ve bazi ozel soz dizimlerinde farklar gorebilirsiniz.

E-posta dogrulamasi icin tek regex yeterli midir?

Basit istemci tarafi kontrol icin iyi bir baslangictir ama tek basina yeterli degildir. Uretimde alan adini, MX kaydini veya dogrulama e-postasini kullanmak gerekir. Regex yalnizca bicim denetimi icin idealdir.

Regex neden bazen cok yavaslar?

Genellikle nedeni asiri backtracking'dir. Ic ice tekrarlar veya belirsiz desenler regex motorunun cok fazla olasilik denemesine neden olur. Daha belirgin desenler, capalar ve yakalamayan gruplar kullanmak bunu azaltir.

HTML parse etmek icin regex kullanilir mi?

Kucuk ve kontrollu metinler icin basit eslesmeler yapabilirsiniz, ancak genel olarak tam HTML ayrisma icin regex onerilmez. Ic ice yapilar ve bozuk markup nedeniyle bir parser kutuphanesi daha guvenlidir.

Regex ogrenmenin en hizli yolu nedir?

En hizli yol, teoriyi kucuk pratiklerle birlestirmektir. Kisa desenler yazin, hemen bir regex tester icinde deneyin, sonra gercek senaryolara uygulayin: e-posta, tarih, URL, log satiri veya form dogrulamasi gibi.