Regex Nedir? Düzenli İfadeler Örneklerle, Temelden İleri Seviyeye

Regex nedir sorusunu yazılıma yeni başlayan herkes bir noktada sorar. Bu rehberde Talha Aslan ve ekibi olarak düzenli ifadeleri tanımdan başlayıp sözdizimine, doğrulama örneklerine, dil farklarına ve performans riskine kadar sade bir dille anlatıyoruz. Kod bloğu yok; yalnız kısa satır içi örnekler var.
Regex nedir?
Regex (regular expression, Türkçesiyle düzenli ifade), bir metin içinde aranacak karakter desenini tarif eden küçük bir dildir. Örneğin \d+ deseni "bir veya daha fazla rakam" demektir. Yazılımcılar bu desenleri arama, doğrulama, ayıklama ve değiştirme işlerinde kullanır; neredeyse her programlama dili ve metin düzenleyici regex destekler.
Kısacası regex, "şu harfi bul" demek yerine "şu kurala uyan her şeyi bul" demenizi sağlar. Bu yüzden tek bir satırlık desen, onlarca satırlık döngü ve koşul kodunun yerini alabilir. Ancak bu güç, okunabilirlik ve bakım maliyetiyle birlikte gelir. Yazının devamında hangi durumda regex seçmeniz, hangi durumda başka bir yola gitmeniz gerektiğini de ele alıyoruz.
Terim, bilgisayar biliminde biçimsel diller teorisinden gelir. Günümüzdeki motorlar ise bu teorinin üstüne geri başvuru, ileri bakış gibi pratik eklemeler yapar. Dolayısıyla "regex" dediğimiz şey, teorik düzenli dillerden biraz daha geniş bir araç ailesidir.
Regex nedir, günlük hayattan bir benzetmeyle nasıl kavrarsınız?
Bir kütüphanede "kapağında 'tarih' yazan kitapları getir" demek düz metin aramasına benzer. Öte yandan "dört haneli bir yılla başlayan, ardından tire ve iki haneli ay gelen raf etiketlerini getir" demek regex mantığıdır. İlk talepte belirli bir kelimeyi ararsınız; ikincisinde bir kalıbı tarif edersiniz.
Başka bir benzetme de şablon kesicidir. Hamuru şablonla kestiğinizde şekle uyan her parça çıkar, uymayan kısım dışarıda kalır. Regex deseni de metnin üstüne konan bir şablondur. Motor metni soldan sağa tarar ve şablona oturan parçaları size verir.
Bu benzetmeler önemli bir gerçeği de gösterir: şablonu kötü çizerseniz yanlış parçalar çıkar. Yani regex yazarken önce neyi yakalamak istediğinizi, sonra neyi kesinlikle yakalamamanız gerektiğini düşünmeniz gerekir. Deneyimimize göre hataların çoğu ikinci soruyu atlamaktan doğar.
Bir düzenli ifade motoru metni nasıl tarar?
Motor, deseni önce iç bir yapıya derler. Ardından metnin ilk karakterinden başlayarak deseni uydurmayı dener. Uyum bozulursa bir sonraki başlangıç noktasına geçer. Böylece desen metnin herhangi bir yerinde eşleşebilir.
Çoğu yaygın motor "geri izleme" (backtracking) yöntemini kullanır. Bu yöntemde motor bir yol seçer, yol çıkmaza girerse geri dönüp başka bir seçenek dener. Örneğin a.*b deseninde motor önce olabildiğince çok karakter yutar, sonra b bulmak için geri çekilir.
Bazı motorlar ise farklı bir yaklaşım izler ve girdinin uzunluğuyla doğru orantılı sürede çalışmayı garanti eder. Ancak bu motorlar geri başvuru gibi bazı özellikleri desteklemez. Bu ayrım, yazının ilerisindeki performans bölümünde önem kazanıyor.
Pratikte motorun iç yapısını ezberlemeniz gerekmez. Yine de "motor her olasılığı deneyebilir" bilgisini akılda tutmak, yavaş desenleri erken fark etmenizi sağlar.
Karakter sınıfları ne işe yarar?
Karakter sınıfı, tek bir konuma gelebilecek karakterlerin kümesidir. Köşeli parantezle yazarsınız: [abc] a, b veya c harfinden birini kabul eder. Aralık da verebilirsiniz; [0-9] herhangi bir rakamı, [a-z] küçük İngilizce harfleri kapsar.
Sık kullanılan sınıfların kısa yazımları da vardır:
\d: bir rakam.\w: harf, rakam veya alt çizgi gibi "kelime karakteri".\s: boşluk, sekme veya satır sonu gibi boşluk karakteri..: varsayılan olarak satır sonu dışındaki herhangi bir karakter.[^0-9]: başa konan şapka ile "rakam olmayan her şey".
Türkçe metinlerde özellikle dikkatli olmalısınız. Örneğin [a-z] aralığı ç, ğ, ı, ö, ş, ü harflerini içermez. Bazı dillerde \w Unicode harfleri kapsar, bazılarında kapsamaz. Bu nedenle Türkçe karakterli veriyle çalışırken kullandığınız dilin belgesine bakıp Unicode davranışını doğrulayın.
Nicelik belirteçleri nasıl çalışır?
Nicelik belirteci (quantifier), kendinden önceki öğenin kaç kez tekrar edeceğini söyler. En temel dört belirteç şunlardır: * sıfır veya daha fazla, + bir veya daha fazla, ? sıfır veya bir, {n,m} en az n en fazla m tekrar.
Örneğin \d{3} tam üç rakam ister. \d{2,4} iki ile dört arası rakamı kabul eder. renk? deseni hem "ren" hem "renk" ile eşleşir, çünkü soru işareti yalnız son harfi isteğe bağlı yapar.
Burada sık atlanan bir nokta vardır: belirteç yalnız hemen solundaki öğeyi etkiler. Bir kelimenin tamamını tekrarlamak istiyorsanız onu parantezle gruplamanız gerekir. Yani ha+ "haaaa" ile eşleşir; (ha)+ ise "hahaha" ile eşleşir.
Ayrıca belirteçleri iç içe kullanmak, performans bölümünde göreceğiniz risklerin kaynağıdır. Basit görünen bir tekrar, uygun olmayan girdide motoru saniyelerce meşgul edebilir.
Gruplar ve yakalama neden önemli?
Parantez iki iş görür. İlk olarak birden fazla öğeyi tek birim yapar ve nicelik belirtecini o birime uygular. İkinci olarak eşleşen parçayı "yakalar"; böylece kodunuzda o parçaya ayrıca ulaşırsınız.
Örneğin (\d{4})-(\d{2})-(\d{2}) deseni bir tarihi bulur ve yılı, ayı, günü üç ayrı grupta saklar. Değiştirme işlemlerinde bu gruplara numarayla başvurursunuz. Böylece "2024-05-17" biçimindeki bir metni gün, ay, yıl sırasına çevirmek tek satırlık bir iş olur.
Yakalamaya ihtiyacınız yoksa yakalamayan grup kullanabilirsiniz: (?:...). Bu yazım hem niyetinizi açıkça gösterir hem de grup numaralarını karıştırmaz. Birçok dil ayrıca isimli grupları destekler. İsimli grup, uzun desenlerde "üçüncü grup neydi?" sorusunu ortadan kaldırır.
Gruplar içinde dikey çizgi | ile seçenek de sunarsınız. Örneğin (jpg|png|webp) üç uzantıdan birini kabul eder. Kısacası gruplar, desenin hem yapısını hem de çıktısını düzenleyen araçtır.
Çapalar ve sınırlar metnin neresini işaretler?
Çapa (anchor) bir karakteri değil, bir konumu temsil eder. ^ metnin ya da satırın başını, $ sonunu işaretler. \b ise kelime sınırıdır; bir kelime karakteriyle kelime dışı karakterin arasındaki görünmez noktayı ifade eder.
Doğrulama yaparken çapalar hayati önem taşır. Örneğin \d{5} deseni "abc12345xyz" içinde de eşleşme bulur, çünkü metnin bir parçasına uyması yeterlidir. Oysa ^\d{5}$ yalnız baştan sona beş rakamdan oluşan metni kabul eder.
Kelime sınırı da aramalarda işinizi kolaylaştırır. \bkar\b deseni "kar" kelimesini bulur ama "karpuz" veya "pakar" içindeki "kar" parçasını atlar. Ancak \b tanımı kelime karakterine bağlı olduğu için Türkçe harflerde dilden dile farklı sonuç verebilir.
Çok satırlı metinlerde ^ ve $ varsayılan olarak tüm metnin başını ve sonunu gösterir. Her satırı ayrı ele almak istiyorsanız çok satır bayrağını açmanız gerekir. Bayrakları bir sonraki bölümlerde kısaca ele alıyoruz.
Açgözlü ve tembel eşleşme arasındaki fark nedir?
Varsayılan olarak nicelik belirteçleri açgözlüdür (greedy). Yani olabildiğince çok karakter yutar, sonra gerekirse geri verir. Tembel (lazy) sürüm ise olabildiğince az karakterle yetinir. Tembel sürümü belirtecin arkasına soru işareti ekleyerek yazarsınız: *?, +?.
Örneğin bir metinde iki tırnaklı ifade olsun: "elma" ve "armut". Açgözlü ".*" deseni ilk tırnaktan son tırnağa kadar her şeyi tek parça alır. Tembel ".*?" ise her tırnaklı ifadeyi ayrı ayrı yakalar. Bu fark, veri ayıklamada doğru sonuçla tamamen yanlış sonuç arasındaki farktır.
Öte yandan tembel belirteç her zaman en iyi çözüm değildir. Çoğu durumda olumsuz karakter sınıfı daha net ve daha hızlıdır. Örneğin "[^"]*" deseni "tırnak olmayan her şey" diyerek aynı işi geri izleme yükü olmadan yapar.
Bu nedenle ekibimiz, tembel belirteç yazmadan önce "burada hangi karakterin gelmeyeceğini biliyor muyum?" diye sorar. Cevap evetse olumsuz sınıf genellikle daha sağlam bir desen üretir.
Bayraklar eşleşmeyi nasıl değiştirir?
Bayrak (flag), desenin tamamına uygulanan bir ayardır. Dillerin yazımı farklı olsa da kavramlar ortaktır. En sık karşılaşacağınız bayraklar şunlardır:
- Büyük küçük harf duyarsızlığı: "Regex" ile "regex" aynı kabul edilir.
- Çok satır modu:
^ve$her satırın başını ve sonunu gösterir. - Nokta her şeyi kapsar modu:
.satır sonlarını da eşler. - Genel arama: ilk eşleşmede durmak yerine tüm eşleşmeleri bulur.
- Unicode modu: harf sınıflarını Unicode kurallarına göre yorumlar.
Büyük küçük harf duyarsızlığı Türkçede ayrıca tuzak içerir. Örneğin "I" ile "ı" ve "İ" ile "i" ilişkisi İngilizce kurallardan farklıdır. Bu yüzden harf duyarsız aramada Türkçe veriyi önce tutarlı biçime çevirmek çoğu zaman daha güvenlidir. Metni hızlıca tek biçime getirmek için büyük küçük harf dönüştürücü aracımızı da kullanabilirsiniz.
İleri bakış ve geri başvuru gibi ileri özellikler nelerdir?
Regex nedir sorusunun temel cevabını öğrendikten sonra ileri özelliklerle karşılaşırsınız. İlk olarak ileri bakış (lookahead) gelir. İleri bakış, bir konumdan sonra belirli bir desenin gelip gelmediğini kontrol eder ama o karakterleri eşleşmeye katmaz. Örneğin \d+(?=TL) deseni yalnız ardından "TL" gelen sayıları bulur.
Olumsuz ileri bakış ise tersini yapar: belirli bir desenin gelmediği konumları seçer. Şifre kurallarında "en az bir rakam içermeli" gibi koşulları bu yolla ifade eden örneklerle sık karşılaşırsınız. Ancak bu tür kuralları ayrı ayrı basit kontrollerle yazmak çoğu zaman daha okunurdur.
Geri başvuru (backreference) ise daha önce yakalanan bir grubun aynısını tekrar aramanızı sağlar. Örneğin (\w+) \1 deseni "ve ve" gibi tekrar eden kelimeleri bulur. Böylece metin düzeltme işlerinde yinelenen kelimeleri hızla yakalarsınız.
Öte yandan bu özellikler her motorda bulunmaz ve performansı zorlayabilir. Dolayısıyla regex nedir sorusunu ileri seviyede cevaplamak, bu özelliklerin hangi dilde desteklendiğini bilmeyi de gerektirir.
E-posta doğrulamada regex nasıl kullanmalısınız?
E-posta doğrulama, regex nedir sorusunun ardından gelen en popüler sorudur. Kısa cevap şu: regex ile e-postanın "kabaca doğru biçimde" olup olmadığını kontrol edin, gerçekten var olup olmadığını ise doğrulama e-postasıyla anlayın.
Standartlara tam uyan bir e-posta deseni son derece uzun ve okunmaz olur. Üstelik pratikte fayda sağlamaz, çünkü biçimce doğru bir adres yine de kullanılmıyor olabilir. Bu nedenle makul bir yaklaşım, "boşluk içermeyen bir parça, bir @ işareti, ardından en az bir nokta içeren alan adı" mantığıyla sınırlı kalmaktır.
Örnek senaryo: bir iletişim formunda kullanıcı adresini yanlışlıkla boşlukla yazıyor. Basit bir desen bunu anında yakalar ve kullanıcıyı uyarır. Buna karşılık çok katı bir desen, yeni alan adı uzantılarını veya artı işaretli adresleri reddederek gerçek müşterileri kaybettirir.
Ayrıca tarayıcıların e-posta giriş alanı kendi doğrulamasını yapar. Sunucu tarafında ise doğrulamayı mutlaka tekrarlayın; istemci tarafı kontrol yalnız kullanıcı deneyimi içindir, güvenlik önlemi değildir. Örnek adreslerde de yalnız example.com gibi ayrılmış alan adlarını kullanın.
Telefon numarası ve tarih doğrulamada nelere dikkat etmelisiniz?
Telefon numaralarında asıl sorun biçim çeşitliliğidir. Kullanıcılar boşluk, tire, parantez veya ülke kodu ekleyebilir. Bu yüzden önce metni normalleştirin: rakam dışı karakterleri [^\d+] gibi bir desenle temizleyin, sonra kalan rakam dizisinin uzunluğunu kontrol edin.
Böylece tek bir karmaşık desen yerine iki basit adım kullanırsınız. İlk adım veriyi düzene sokar, ikinci adım kuralı uygular. Uluslararası numaralarda uzunluk ülkeye göre değiştiği için kesin kuralı tek bir regex içine gömmek genellikle hatalıdır.
Tarihlerde ise regex yalnız biçimi kontrol eder. Örneğin ^\d{4}-\d{2}-\d{2}$ deseni "2024-02-31" metnini memnuniyetle kabul eder; oysa şubatın 31. günü yoktur. Kısacası takvim mantığı regex işi değildir.
Doğru akış şöyledir: regex ile biçimi hızlıca eleyin, ardından dilin tarih kütüphanesiyle metni gerçek bir tarihe çevirmeyi deneyin. Çeviri başarısızsa tarih geçersizdir. Bu iki katmanlı yaklaşım hem anlaşılır kalır hem de sağlam çalışır.
Programlama dilleri arasında regex lehçeleri nasıl farklılaşır?
Regex tek bir standart değil, ortak bir çekirdeği paylaşan lehçeler ailesidir. Karakter sınıfları, nicelik belirteçleri ve gruplar neredeyse her yerde aynıdır. Ancak ileri özelliklerde farklar başlar.
Örneğin JavaScript tarafında desenleri eğik çizgiler arasına yazıp bayrakları sona eklersiniz; ayrıntılar MDN düzenli ifadeler rehberinde yer alır. Python ise desenleri re modülüyle işler ve ters eğik çizgi karmaşasını önlemek için ham dize (r"...") yazımını önerir; bu konu Python re modülü resmi belgesinde anlatılır.
Farklılaşan başlıca noktalar şunlardır:
- Adlandırılmış grup yazımı ve değiştirmede gruba başvuru biçimi.
- Geriye bakış (lookbehind) desteği ve sınırları.
- Unicode sınıflarının varsayılan davranışı.
- Bayrakların adı ve hangi bayrakların bulunduğu.
- Bazı motorlarda geri başvurunun hiç olmaması.
Dolayısıyla bir dilde çalışan deseni başka bir dile taşırken mutlaka test edin. Python ile çalışıyorsanız popüler Python kütüphaneleri yazımız metin işleme ekosistemine geniş bir bakış sunar.
ReDoS nedir ve regex performansını nasıl korursunuz?
ReDoS (Regular expression Denial of Service), kötü kurulmuş bir desenin belirli girdilerde aşırı uzun çalışması ve uygulamayı kilitlemesidir. OWASP ReDoS sayfası bu riski, geri izleme yapan motorlarda iç içe tekrarlar nedeniyle oluşan "felaket boyutunda geri izleme" olarak açıklar.
Riskli kalıp genellikle tekrar içinde tekrardır; (a+)+ gibi. Eşleşme başarısız olduğunda motor, karakterleri gruplara bölmenin her olası yolunu dener. Girdi uzadıkça deneme sayısı katlanarak artar.
Savunma tarafında uygulayabileceğiniz önlemler şunlardır:
- İç içe nicelik belirteçlerinden kaçının; mümkünse tek düzeyli tekrar kullanın.
- Seçenekleri birbirinden ayırt edilebilir yazın; aynı metni iki farklı yoldan eşleyen alternatifler kurmayın.
- Kullanıcı girdisinin uzunluğunu regex çalışmadan önce sınırlayın.
- Dilin veya kütüphanenin zaman aşımı seçeneği varsa kullanın.
- Kritik yerlerde doğrusal süre garantisi veren bir motoru değerlendirin.
- Kullanıcıdan gelen metni asla doğrudan desen olarak çalıştırmayın.
Ayrıca sunucu günlüklerinde ani yavaşlamaları izlemek erken uyarı verir. Bu konuda log analizi aracımız uzun süren istekleri bulmanıza yardımcı olabilir.
Regex, düz metin araması ve ayrıştırıcı karşılaştırması
Doğru aracı seçmek, iyi desen yazmaktan daha çok zaman kazandırır. Aşağıdaki tablo üç yaklaşımı yan yana koyuyor:
| Ölçüt | Düz metin araması | Regex | Ayrıştırıcı (parser) |
|---|---|---|---|
| Ne arar? | Sabit bir kelime veya ifade | Kurala uyan desen | Dilin tam yapısı |
| Öğrenme eğrisi | Yok denecek kadar düşük | Orta | Yüksek, ama kütüphane çoğu işi yapar |
| İç içe yapı | Desteklemez | Sınırlı, kırılgan | Doğal olarak destekler |
| Okunabilirlik | Çok yüksek | Desen uzadıkça düşer | Kod ve kurallar açık |
| Performans riski | Çok düşük | Kötü desende ReDoS | Genellikle öngörülebilir |
| Tipik kullanım | Dosyada kelime bulma | Biçim doğrulama, ayıklama | HTML, JSON, YAML, programlama dili |
Kısacası sabit bir metin arıyorsanız regex gereksizdir. İç içe yapılı bir veri biçimi işliyorsanız ise regex yetersiz kalır. Örneğin YAML dosyalarını kendi ayrıştırıcısıyla okumak gerekir; bu biçimi YAML nedir ve JSON farkı yazımızda ayrıca anlatıyoruz.
Regex nedir öğrenirken en sık yapılan hatalar
Regex nedir sorusunu yeni cevaplayan biri genellikle birkaç tipik hataya düşer. Bunları önceden bilmek, saatlerce süren hata ayıklamayı önler.
- Noktayı kaçışsız yazmak:
."nokta" değil "herhangi bir karakter" demektir; gerçek nokta için\.yazmalısınız. - Çapayı unutmak: doğrulamada
^ve$olmadan desen metnin yalnız bir parçasına bakar. - Açgözlü belirteçle fazla yakalamak: tırnaklar veya etiketler arasında beklenmedik uzun eşleşmeler çıkar.
- Ters eğik çizgi karmaşası: dilin dize kuralları ile regex kuralları üst üste biner.
- Türkçe karakterleri unutmak:
[a-z]aralığı ğ ve ş gibi harfleri kapsamaz. - Tek dev desene her şeyi sığdırmak: bakım yapılamaz bir satır ortaya çıkar.
Bu hataların ortak çözümü test etmektir. Her desen için en az birkaç "eşleşmeli" ve birkaç "eşleşmemeli" örnek hazırlayın. Böylece deseni değiştirdiğinizde neyin bozulduğunu hemen görürsünüz.
Gerçek projelerde regex nerelerde işe yarar?
Regex, günlük yazılım işinin pek çok küçük ama sık tekrarlanan görevinde zaman kazandırır. Aşağıda ekibimizin sahada sık gördüğü kullanım alanlarını örnek senaryolarla özetliyoruz.
Örnek senaryo bir: bir e-ticaret sitesinin ürün açıklamalarında eski bir telefon numarası geçiyor. Metin düzenleyicide tek bir regex ile numaranın bütün yazım biçimlerini bulup yenisiyle değiştirirsiniz.
Örnek senaryo iki: sunucu günlüklerinden belirli bir hata kodunu içeren satırları ve o satırlardaki adresleri ayıklamanız gerekiyor. Gruplu bir desen hem satırı seçer hem de adresi ayrı bir sütun gibi verir.
Örnek senaryo üç: bir web sitesinde adres yapısını değiştirdiniz ve eski adresleri yenilerine yönlendirmeniz gerekiyor. Sunucu yönlendirme kuralları çoğu zaman regex kabul eder. Temiz adres biçimleri üretmek için slug oluşturucu aracımızdan da yararlanabilirsiniz.
Ayrıca kod depolarında toplu yeniden adlandırma, form alanı doğrulama ve veri temizleme regex'in klasik alanlarıdır. Kod değişikliklerini güvenle takip etmek için Git ve GitHub rehberimize göz atabilirsiniz.
API ve webhook verilerinde regex kullanmak doğru mu?
API yanıtları genellikle JSON gibi yapılı biçimlerde gelir. Bu durumda alanları regex ile çekmek yerine dilin JSON ayrıştırıcısını kullanmalısınız. Çünkü alan sırası, boşluklar veya kaçış karakterleri değiştiğinde regex sessizce bozulabilir ve hata vermez.
Öte yandan ayrıştırılmış verinin tek bir alanını doğrulamak regex için uygun bir iştir. Örneğin bir sipariş numarasının belirli bir biçime uyup uymadığını kontrol edebilirsiniz. API kavramının temellerini API nedir yazımızda anlatıyoruz.
Benzer şekilde webhook ile gelen bildirimlerde de önce imzayı doğrulayıp gövdeyi ayrıştırmak gerekir. Regex ancak ondan sonra, tekil alanların biçim kontrolünde devreye girer. Webhook akışının tamamını webhook nedir yazımızda bulabilirsiniz.
Kısacası kural basittir: yapıyı ayrıştırıcıya, tekil değeri regex'e bırakın. Bu ayrım, hem hatayı azaltır hem de kodu okuyan bir sonraki geliştiricinin işini kolaylaştırır.
Okunabilir ve sürdürülebilir regex nasıl yazarsınız?
Bir desen yazdığınız gün net görünür; altı ay sonra ise bilmeceye dönüşebilir. Bu yüzden okunabilirliği baştan planlamak gerekir.
İlk olarak deseni parçalara bölün. Birçok dil, deseni değişkenlerden birleştirmenize izin verir. Örneğin "yıl", "ay" ve "gün" parçalarını ayrı adlarla tanımlayıp birleştirdiğinizde desen kendini açıklar.
İkinci olarak, desteklenen dillerde ayrıntılı mod (verbose) kullanın. Bu mod boşlukları yok sayar ve desen içine açıklama yazmanıza izin verir. Python belgesi bu modu ayrıca tanıtır.
Üçüncü olarak isimli gruplar kullanın. Kodda "grup 3" yerine "gun" yazmak, değişiklikte hata riskini belirgin biçimde azaltır.
Son olarak her desenin yanında küçük bir test listesi tutun. Deseni değiştirdiğinizde testler hemen sonuç verir. Böylece regex, korkulan bir kara kutu olmaktan çıkar ve sıradan bir kod parçası gibi bakım görür.
Regex nedir sorusundan sonra pratik kontrol listesi
Bir deseni üretime göndermeden önce aşağıdaki listeyi gözden geçirmenizi öneriyoruz:
- Bu iş için düz metin araması veya hazır bir ayrıştırıcı yeterli mi?
- Doğrulama yapıyorsam başta ve sonda çapa var mı?
- Özel karakterleri (nokta, artı, parantez) gerektiği yerde kaçırdım mı?
- Türkçe veya başka Unicode karakterler veride geçiyor mu?
- İç içe tekrar ya da çakışan seçenek içeren bir parça var mı?
- Girdi uzunluğunu sınırladım mı?
- En az beş eşleşmeli ve beş eşleşmemeli örnekle test ettim mi?
- Deseni başka bir dile taşıyorsam o dilin belgesine baktım mı?
Bu liste kısa görünse de üretimde karşılaşılan regex sorunlarının büyük kısmını yakalar. Özellikle altıncı ve beşinci madde güvenlik açısından önemlidir. Metin uzunluklarını hızlıca ölçmek için kelime ve karakter sayacı aracımız da işe yarar.
Regex ne zaman doğru araç değildir?
Regex güçlüdür ama her soruna uygun değildir. HTML, XML veya JSON gibi iç içe yapılı biçimler bunun en bilinen örneğidir. Bu biçimlerde etiketler veya parantezler istediğiniz kadar iç içe geçebilir; düzenli ifadeler ise bu derinliği güvenilir biçimde izleyemez.
Ayrıca iş kuralları sık değişiyorsa uzun bir regex yerine sade kod yazmak daha akıllıcadır. Örneğin "kullanıcı tipi kurumsal ise vergi numarası zorunlu" gibi bir kural regex'e değil, koşul ifadesine aittir.
Doğal dil işleme de ayrı bir alandır. Bir cümlenin olumlu mu olumsuz mu olduğunu regex ile anlamaya çalışmak kısa sürede kırılgan bir yapıya dönüşür. Bu tür işler için dil modelleri ve özel kütüphaneler daha uygundur.
Kısacası regex, iyi tanımlanmış ve düz yapılı metin desenleri için en iyi sonucu verir. Desen bir paragraf uzunluğuna yaklaşıyorsa durup başka bir yaklaşımı düşünmenin zamanı gelmiştir.
Ekibimiz regex'i projelerde nasıl ele alıyor?
Talha Aslan ve ekibi olarak web projelerinde regex'i küçük, test edilmiş ve belgelenmiş parçalar halinde kullanıyoruz. Doğrulama katmanında biçim kontrolü yapıyor, iş mantığını ise ayrı kodda tutuyoruz.
Kullanıcı girdisi işleyen her desende uzunluk sınırını ve ReDoS riskini gözden geçiriyoruz. Ayrıca bir deseni projeye eklemeden önce eşleşmeli ve eşleşmemeli örneklerden oluşan küçük bir test seti hazırlıyoruz. Böylece ileride yapılan değişiklikler sessizce hata üretmiyor.
Formlardan veri temizlemeye, yönlendirme kurallarından günlük analizine kadar metin işleme ihtiyacı olan özel bir uygulama düşünüyorsanız özel yazılım geliştirme hizmetimiz kapsamında birlikte planlayabiliriz.
Bir projede regex ile ilgili kararsız kaldığınızda basit bir soru sorun: bu deseni altı ay sonra başka bir geliştirici okuyup anlayabilir mi? Cevap hayırsa deseni bölün, adlandırın veya yerine sade bir kod yazın. Bu alışkanlık, ekip içinde bakım maliyetini belirgin biçimde düşürür.
Son bir not: regex öğrenmenin en hızlı yolu, gerçek bir küçük problemi çözmektir. Bir dosyadaki tarihleri bulmak veya bir listedeki e-posta biçimlerini kontrol etmek gibi basit bir görevle başlayın ve her adımda testinizi çalıştırın.



