içerik
" metninde tamamını eşleştirir, sadece "" kısmını değil. Çünkü yıldız, son > karakterine kadar her şeyi alır.
Tembel (non-greedy) eşleşme için niceleyicinin ardına soru işareti eklenir. "<.*?>" deseni sadece "
" ile eşleşir.
Gruplar ve Alternatifler
Parantezler gruplama için kullanılır. Grupların iki ana işlevi vardır: deseni organize etmek ve eşleşen kısmı yakalamak.
Yakalama Grupları
"(ab)+" deseni ab, abab, ababab ile eşleşir. Parantez içindeki kısım yakalanır ve sonradan kullanılabilir.
Geri referanslar yakalanan grupları tekrar kullanmayı sağlar. "(\w+)\s+\1" deseni tekrar eden kelimeleri bulur. \1 ifadesi birinci yakalama grubunu referans alır.
Yakalamayan Gruplar
Bazen sadece gruplama gerekir, yakalama gerekmez. "(?:ab)+" deseni gruplama yapar ama yakalamaz. Bu performans açısından daha verimlidir.
Alternatifler (|)
Pipe karakteri VEYA anlamına gelir. "kedi|köpek" deseni kedi veya köpek ile eşleşir. "(pazartesi|salı|çarşamba)" deseni bu üç günden biriyle eşleşir.
İleri Düzey: Lookaround
Lookaround (bakınma) ifadeleri, karakterleri tüketmeden koşullu eşleşme sağlar. Dört türü vardır:
Pozitif İleri Bakış (Positive Lookahead)
"X(?=Y)" sözdizimi: X'i bul, ama sadece Y takip ediyorsa.
"\d+(?=€)" deseni 30€ içindeki 30 ile eşleşir. Euro işareti kontrol edilir ama eşleşmeye dahil edilmez.
Negatif İleri Bakış (Negative Lookahead)
"X(?!Y)" sözdizimi: X'i bul, ama Y takip etmiyorsa.
"q(?!u)" deseni "Iraq" içindeki q ile eşleşir ama "queen" içindeki q ile eşleşmez. İngilizce'de q harfinden sonra genellikle u gelir, bu desen istisnai durumları bulur.
Pozitif Geri Bakış (Positive Lookbehind)
"(?<=Y)X" sözdizimi: X'i bul, ama sadece Y öncesinde geliyorsa.
"(?<=\$)\d+" deseni $100 içindeki 100 ile eşleşir. Dolar işareti kontrol edilir ama eşleşmeye dahil edilmez.
Negatif Geri Bakış (Negative Lookbehind)
"(?[a-z])(?=.[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$
Bu desen lookahead kullanır: (?=.[a-z]) en az bir küçük harf, (?=.[A-Z]) en az bir büyük harf, (?=.*\d) en az bir rakam, [a-zA-Z\d]{8,} toplam en az 8 karakter.
Programlama Dillerinde Regex
Her dilin regex kullanımı biraz farklıdır. İşte yaygın dillerde örnekler:
JavaScript
const metin = "E-posta: [email protected]";
const desen = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/;
const sonuc = metin.match(desen);
JavaScript'te regex desenleri / / arasına yazılır. Bayraklar: g (global, tüm eşleşmeler), i (büyük-küçük harf duyarsız), m (çok satırlı).
Python
import re
metin = "E-posta: [email protected]"
desen = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
sonuc = re.search(desen, metin)
Python'da r öneki raw string oluşturur, ters slash sorunlarını önler.
PHP
$metin = "E-posta: [email protected]";
$desen = "/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/";
preg_match($desen, $metin, $sonuc);
PHP'de preg_match, preg_match_all, preg_replace fonksiyonları kullanılır.
Test Araçları
Regex yazmak zor olabilir. Neyse ki yardımcı araçlar var:
regex101.com en popüler test aracı. Deseni ve metni girdiğinizde eşleşmeleri gösterir, deseni açıklar ve farklı dil seçenekleri sunar.
regexr.com interaktif öğrenme ortamı sunar. debuggex.com görsel regex açıklaması sağlar.
Bu araçları kullanarak desenlerinizi gerçek veriler üzerinde test edin.
Yaygın Hatalar ve İpuçları
Özel karakterleri escape etmeyi unutmak sık yapılan bir hatadır. Nokta, köşeli parantez, parantez gibi karakterler özel anlam taşır. Literal olarak kullanmak için \ ile escape edin.
Aşırı karmaşık desenler yazmaktan kaçının. Uzun ve anlaşılmaz regex'ler bakımı zorlaştırır. Gerekirse birden fazla basit desene bölün.
Performansa dikkat edin. Yanlış yapılandırılmış desenler "catastrophic backtracking" sorunu yaratabilir. Özellikle iç içe niceleyicilerden kaçının: (a+)+ gibi.
Satır sonu karakterlerini unutmayın. Farklı işletim sistemleri farklı satır sonu karakterleri kullanır (Windows: \r\n, Unix: \n). Bunu göz önünde bulundurun.
Sonuç
Regex, metin işleme problemlerini çözmek için güçlü bir araç. İlk bakışta karmaşık görünse de temel yapı taşlarını öğrendikten sonra mantığı oturur.
Öğrenme stratejisi olarak basit desenlerle başlayın. Meta karakterleri tek tek öğrenin. regex101.com gibi araçlarla pratik yapın. Gerçek problemler üzerinde çalışın.
Regex her programcının araç kutusunda bulunması gereken bir beceri. E-posta doğrulamadan log analizine, kod refactoring'den veri temizlemeye kadar sayısız alanda işinize yarayacak.
Tek seferlik bir öğrenme yatırımıyla, yıllar boyunca zaman kazanacaksınız.
0 Yorum
Yorum Yaz