İçeriğe geç

Kitaplar / Yöntem Birimler ve Araçlar Kılavuzu / 5. Desen: düzenli ifadeler

5. Desen: düzenli ifadeler

Düzenli ifade (regex), aranan metnin biçimini tarif eden küçük bir dildir: “iki rakam, iki nokta, iki rakam” gibi. Desen birimi bunlarla doğrulama, arama, ayıklama ve değiştirme yapar.

Yöntem
program SiparişAyıklama
{ Desen birimi: düzenli ifadelerle doğrulama, ayıklama ve değiştirme. }
kullan Desen

sabit YAZI: metin = 'Sipariş #A-1042: 3 adet çay, 12 adet simit; iletişim: edaece@ornek.de, 0532 123 45 67'

değişken g: herhangi

başla
  yaz('Sipariş no : ' + Bul(YAZI, '#[A-Z]-\d+'), 1)
  yaz('Adetler    : ' + Metin(BulHepsi(YAZI, '\d+ adet')), 1)
  TümGruplar(YAZI, '(\d+) adet (\w+)') içindeki her g için
    yaz('  ' + g[2] + ' × ' + g[1], 1)
  yaz('E-posta    : ' + Bul(YAZI, '[\w.]+@[\w.]+\.\w+'), 1)
  yaz('Telefon mu : ' + Metin(TamEşleşir('0532 123 45 67', '0\d{3} \d{3} \d{2} \d{2}')), 1)
  yaz('Gizlenmiş  : ' + DesenDeğiştir(YAZI, '(\d{4}) \d{3} \d{2} (\d{2})', '$1 *** ** $2'), 1)
  yaz('Parçalar   : ' + Metin(DesenAyır('çay; simit ,peynir', '\s*[;,]\s*')), 1)
  yaz('Harf ayrımı: ' + Metin(Eşleşir(YAZI, 'SİPARİŞ')) + ', "i" ile: ' + Metin(Eşleşir(YAZI, 'SİPARİŞ', 'i')), 1)
bitir.
Çıktı
Sipariş no : #A-1042
Adetler    : ['3 adet', '12 adet']
  çay × 3
  simit × 12
E-posta    : edaece@ornek.de
Telefon mu : doğru
Gizlenmiş  : Sipariş #A-1042: 3 adet çay, 12 adet simit; iletişim: edaece@ornek.de, 0532 *** ** 67
Parçalar   : ['çay', 'simit', 'peynir']
Harf ayrımı: yanlış, "i" ile: doğru

Desenleri tek tırnak içinde yazmanızı öneririz; tek tırnaklı metinlerde \ olduğu gibi kalır.

Desen Anlamı
a, çay Kendisi
. Satır sonu dışında herhangi bir karakter
\d, \w, \s Rakam; harf, rakam ya da _; boşluk. Büyük harflisi tersidir (\D)
[abc], [a-z], [^0-9] Kümedeki bir karakter; aralık; kümede olmayan
x*, x+, x? Sıfır ya da çok; bir ya da çok; sıfır ya da bir
x{3}, x{2,4}, x{2,} Tam 3; 2 ile 4 arası; en az 2
x*?, x+? Tembel: olabildiğince az
(…), (?:…) Yakalayan grup; yakalamayan grup
a\|b a ya da b
^, $, \b Metnin başı; sonu; sözcük sınırı
\., \(, \\ Özel karakterin kendisi

\w Türkçe harfleri de kapsar. Son argüman olarak 'i' verilirse büyük/küçük harf ayrımı kalkar ve Türkçedeki dört i (İ I ı i) birbirine eş sayılır.

Üye Ne döndürür
Eşleşir(metin, desen) Desen metnin bir yerinde geçiyor mu
TamEşleşir(metin, desen) Metnin tamamı desene uyuyor mu (doğrulama için)
Bul(metin, desen) İlk eşleşme ya da boş
BulHepsi(metin, desen) Tüm eşleşmelerin listesi
Gruplar(metin, desen) İlk eşleşme için [tamamı, 1. grup, 2. grup…] ya da boş
TümGruplar(metin, desen) Her eşleşme için böyle bir liste
DesenKonumu(metin, desen) İlk eşleşmenin başladığı karakter (yoksa 0)
DesenDeğiştir(metin, desen, yeni) Tüm eşleşmeleri değiştirir; $1 grup, $0 eşleşmenin tamamı, $$ dolar işareti
DesenAyır(metin, desen) Metni eşleşmelerden böler
DesenKaçış(metin), DesenGeçerli(desen) Özel karakterleri etkisizleştirir; deseni denetler

Birim kendi eşleştirme motorunu kullanır, bu yüzden her ortamda aynı sonucu verir. İleri/geri bakış ((?=…)) ve geri başvuru (\1) yoktur. İç içe tekrar içeren desenler ((a+)+) bazı metinlerde çok uzun sürebilir; birim böyle durumda programı kilitlemek yerine hatayla durdurur. Kullanıcının yazdığı metni desenin içine koyacaksanız önce DesenKaçış ile kaçışlamanız gerekir.