Regular expressions (regex) nasil kullanilir: gelistiriciler icin tam rehber
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:
| Metakarakter | Anlam | Ornek | Eslesme |
|---|---|---|---|
. | Herhangi bir karakter (satir sonu haric) | k.ti | "kedi", "kiti", "k3ti" |
^ | Satirin/dizenin basi | ^Merhaba | "Merhaba dunya" (yalnizca basta) |
$ | Satirin/dizenin sonu | dunya$ | "Merhaba dunya" (yalnizca sonda) |
* | 0 veya daha fazla tekrar | ab*c | "ac", "abc", "abbc", "abbbc" |
+ | 1 veya daha fazla tekrar | ab+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 [ ]:
| Desen | Anlam | Eslesme 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:
| Kisaltma | Esdegeri | Anlam |
|---|---|---|
\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:
| Niceleyici | Anlam | Ornek | Eslesme |
|---|---|---|---|
* | 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 dizimi | Tur | Kullanim amaci |
|---|---|---|
(...) | Yakalama grubu | Eslesen metni hafizada tutar |
(?:...) | Yakalamayan grup | Sadece gruplama yapar, hafizada tutmaz |
(?<name>...) | Isimli grup | Gruplara 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+\1tekrar eden kelimeleri bulur ("ve ve", "bu bu")(['"])(.*?)\1acilis 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 dizimi | Adi | Anlam |
|---|---|---|
(?=desen) | Pozitif lookahead | Sonraki kisim desenle eslesmek zorundadir |
(?!desen) | Negatif lookahead | Sonraki kisim desenle eslesmemelidir |
(?<=desen) | Pozitif lookbehind | Onceki kisim desenle eslesmek zorundadir |
(?<!desen) | Negatif lookbehind | Onceki 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:
| Flag | Adi | Etkisi |
|---|---|---|
g | Global | Ilk eslesme yerine tum eslesmeleri bulur |
i | Case insensitive | Buyuk/kucuk harf ayrimini kaldirir |
m | Multiline | ^ ve $ her satirin basi/sonu ile eslesir |
s | Dotall | Nokta . satir sonlarini da kapsar |
u | Unicode | Tam 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.