| Düzenli AnlatımlarÇeviri: Özkan Özer (Gözden geçirilmekte)Özet: eDüzenli
ifadeler ileri seviyede içerige duyarli aramalarda ve metin degisiklikler
için kullanilir. Bunlar çogu gelismis yazi islemcilerinde
bulunabilir. Parser programlarinda ve dillerde.
 
 
 Giris
 Düzenli ifadeler, vi ve emacs gibi cogu yazim islemcilerinde,
grep/ egrep gibi programlarin içerisinde ve awk, perl, ve sed gibi
birçok dilde bulunabilir.
 Düzenli ifadeler, ileri seviyede içerige duyarli aramalarda
ve metin biçimlendirilmelerinde kullanilir. Bir düzenli ifade
metin seritine karsi eslestirilen bir modelin biçimsel bir tanimlamasidir. 
 Birkaç yýl önce düzenli ifadeleri kullanan insanlar
gördügümde, etkilenistim. Metin yazimi ve saatler alan arama
isi birkaç saniye içerisinde yapilabilir. Ayni zamanda, ekranda
aciklamalar gördügümde bir kelimeyi anlamadim. Buna ragmen
onlar nasil çalistigini ögrenmeye kararliydim. Neredeyse onlarin
kullaniminin nasil oldukça basit oldugunu buldum. Birkaç
sözdizim kurallarini izlerler. 
 Her nekadar düzenli ifadeler Unix dünyasinda oldukça
genis bir yayilima sahipse de, "standart düzenli ifade dili" gibi
birsey yoktur. Bu daha fazla birkaç farkli lehçeye benzer.
grep programlarinin örnegin iki çesidi vardir;grep ve egrep.
Ikiside azicik farkli yetenekleriyle düzenli ifadeleri kullanir. Perl
düzenli ifadelerin en eksiksiz kümesine sahiptir.Sansa, hepsi
benzer kurallari izler.Temel düsünceyi anladiginiz zaman, farkli
lehçelerin detaylarini ögrenmek çok kolaydir. 
 Bu makale size temelleri tanitacaktir ve program degisikleri ve yetenekleri
hakkinda bilgi sahibi olabilmek için farkli programlarin kilavuz
sayfalarina bakabilirsiniz. 
 
Basit Bir ÖrnekBir sirketin telefon listesine sahipsiniz ve suna benziyor:Telefon Isim Kimlik
     ...
     ...
3412    Bob 123
3834  Jonny 333
1248   Kate 634
1423   Tony 567
2567  Peter 435
3567  Alice 535
1548  Kerry 534
     ...Bu 500 kisilik bir sirkettir. Verileri sadece ASCII yazi dosyalari seklinde
saklamaktadirlar. Telefon numarasinin ilk rakami 1 olan insanlar 1. binada
çalismaktadirlar. Kimler 1. binada calisiyorlar. Düzenli ifadeler sunu cevap verebilir:
grep '^1' phonelist.txt
or
egrep '^1' phonelist.txt
or
perl -ne 'print if (/^1/)' phonelist.txtKelimelerle bunun anlami, 1 ile baslayan tüm satirlari ara, "^" isareti
bir satir baslangicinin karsiligidir. Sadece 1. karakter olarak bir satir
1'e sahipse, "^" tüm ifadeyi eslemek için zorlar. 
Sözdizim Kurallari
Tek Karakterli YapilarBir düzenli ifadenin temel insa blogu tek-karakterli yapidir. Sadece
bu karakter ile eslesir. Tek-karakterli yapinin bir örnegi yukaridaki
örnekteki 1'dir.Yazi içerisinde sadece 1 ile eslesir.Tek-karakterli yapi için bir diger örnek:
egrep 'Kerry' phonelist.txtBu yapi sadece tek-karakterli yapilardan olusur. (K,e... harfleri) Karakterler bir küme içerisinde beraberce gruplandirilabilir.
Bir küme bir çift açik ve kapali köseli parantezler
ve bu parantezlerin arasindaki karakterlerin listesiyle gösterilebilir.
Bir küme bütün olarak tek-karakterli bir yapidir. bu karakterlerden
bir ve sadece bir tanesi eslenme için arama metninde gösterilmek
zorundadir.Bir örnek:
 [abc]    ya a, ya b, ya da c ile eslesen tek-karakterli bir yapidir.
[ab0-9]  ya a, ya b, ya da 0'dan 9'a kadar ASCII karakterler içinden biriyle eslesen tek-karakterli bir yapidir. 
         
[a-zA-Z0-9\-] Ya bir büyük harf, ya da küçük harf, bir rakam veyA eksi isareti ile eslesen tek-karakterli bir yapidir. 
Sunu denyelim:
egrep '^1[348]' phonelist.txt13,14 veya 18 ile baslayan tüm satirlari tarar. Biz en çok sadece bu ASCII karakterler ile eslesen ASCII karakterleri
gördük. Fakat bazi ASCII karakterler özel anlamlara sahiptirler.Özel
bir karakterin özel bir anþamindan kurtulmak için bir
backslash'  tan  önce yazabilirsiniz. [a-zA-Z0-9\-]
içindeki eksi isareti bunun için bir örnektir.Özel
karakterlerin backslash ile kullanildigi  düzenli ifade dilinin
birkaç lehçeleri vardir. Bu durumda normal anlami elde etmek
için backslash'i kaldirmamiz gerekir.
 Nokta önemli bir özel karakterdir. Yeni satir karakteri disinda
hersey ile eslesir. Örnek:
 grep '^.2' phonelist.txt
 veya
egrep '^.2' phonelist.txtIkinci konumu 2 olan tüm satirlari arar. ve birinci karakter olarak
hiçbirsey tanimlanmamistir. Kümeler küme taniminda "[" ' nin yerine "[^" 'nin kullanilmasiyla
ters cevrilebilir. Buradaki "^" isareti satirin uzun olmadigi anlamina
gelir.?? fakat "[" ve "^"  isaretlerinin birlesimi ters çevrilmis
kümeyi gösterir. 
 [0-9]    0'dan 9'a ASCII karakterler içinde bir rakam ile eslesen tek-karakterli bir yapidir.  
         
[^0-9]   Rakam olmayan herhangi bir karakter ile eslenir.
[^abc]   a,b, veya c olmayan herhangi bir karakterle eslesir. 
 .       Nokta yeni satir karakteri disinda hersey ile eslesir. Bu da [\n] ile benzerdir. \n yeni satir karakteridir.
^ ile baslayan tüm satirlari eslemek için, sunu yazabiliriz.
grep '^[^1]' phonelist.txt
veya
egrep '^[^1]' phonelist.txt 
(Anchors?)Bir satirin baslangicina tekabül eden "^" isaretini henüz bir
önceki bölümde gördük. Anchors metinin herhangi 
bir karakteri için degil metin içinde herhangi bir konunmla
eslesen düzenli bir ifadedir.^  Bir satirin baslangicina tekabül eder.
$  Bir satirin sonuna tekabül eder.phonelist.txt ' teki kimlik numarasi 567 olan insanlari aramak için
sunu kullaniriz: egrep '567$' phonelist.txtBu satir sonunda 567 numarali satirlari arar. 
ÇogalticilarBir çogaltici bir metin içindeki tek-karakterli yapinin ne
kadar siklikla  vuku buldugunu? belirler.
 
| tanim | grep | egrep | perl | vi | vim | vile | elvis | emacs |  
| 0 ve daha fazla | * | * | * | * | * | * | * | * |  
| Bir ve daha fazla | \{1,\} | + | + |  | \+ | \+ | \+ | + |  
| 0 ve bir kere | \? | ? | ? |  | \= | \? | \= | ? |  
| n'den m'e kadar | \{n,m\} |  | {n,m} |  |  |  | \{n,m\} | \{n,m\} |  Not: Çesitli VIlar yukarida gösterildigi gibi çalismak
için  sihirli seçenek kümeleri vardir.
 Telefon listesinden bir örnek:
 ....
1248   Kate 634
....
1548  Kerry 534
....***1 ile baslayan bir satiri eslemek için,rakamlari var, To match
a line that starts with a 1, has some digits, at least one space and a
name that starts with a K we can write: grep '^1[0-9]\{1,\} \{1,\}K' phonelist.txt
veya * kullan ve [0-9] ve boglugu tekrar et:
grep '^1[0-9][0-9]*  *K' phonelist.txt
veya
egrep '^1[0-9]+ +K' phonelist.txt
veya
perl -ne 'print if (/^1[0-9]+ +K/)' phonelist.txtÇogaltici önceki tek-karakterli yapinin vukusunu çogaltir.
Böylece "23*4", 2 sonra 3 hiçbir 4 anlamina gelmez. ("23,*4olacak).
Bunun anlami "1 kere 2 sonra belki birkaç 3 ve bir 4 " ' tür.Ayrica bir çogalticinin açgözlü oldugunu belirtmek
çok önemlidir. Bu yapi içerisindeki birinci çogalticinin
saga dogru olabildigine uzadaigi anlamina gelmez. 
 ^1.*4 ifadesi bütün satir ile eslesir. 
1548  Kerry 534 baslangici en son 4'e kadar düzenler. 
Sadece 154 ile eslesmez.Bu grep için büyük bir fark yapmaz. Yazim ve biçimleme
için önemlidir. 
Bir Hafiza Olarak ParantezlerBir hafiza olarak parantezler ifadenin yöntemini degistirmez, fakat
sebeplerin yerine sonradan tercih edilsin diye ilistirilmis metin parcasi
hatirlanmaliHatirlanan parça kullanisli vi degiskenleridir. Bir hafiza olarak
parantezlerin birinci yapisi  kullanisli vi degiskenleridir.Ikinci
yapi ise kullanisli vi degiskeni 2 ve 3 olarak devam eder.
 
| Program ismi | Parantez Sözdizimi | Degisken Sözdizimi |  
| grep | \(\) | \1 |  
| egrep | () | \1 |  
| perl | () | \1 or ${1} |  
| vi,vim,vile,elvis | \(\) | \1 |  
| emacs | \(\) | \1 |  Örnek:
 [a-z][a-z]ifadesi iki küçük harf ile eslesir.   Simdi "otto" yazisi gibi yazilari arastirmak için bu deiskenleri
kullanabiliriz: egrep '([a-z])([a-z])\2\1'
\1 degiskeni o harfini ve \2 degiskeni t harfini içermez.
Ifade anna ismi ile eslesecektir, fakat yxyx ile eslenmeyecektir.Bir hafiza olarak parantezler yapilari otto ve anna gibi isimleri bulmak
için çok fazla kullanilmaz, fakat yazim ve biçimleme
için daha fazla kullanilir. 
Düzenli Ifadelerin Metin Yazimi için KullanimiYazim islemini yapabilemk için vi ve emacs gibi yazim islemcilerine
ihtiyaç duyulur veya perl'ü kullanabilirsiniz.Emacs'ta In  M-x query-replace-regexp' i kullanirsiniz veya   
query-replace-regexp'i bazi fonksiyon tuslarina koyarsiniz veya seçime
bagli olaraktan replace-regexp komutunu kullanabilirsiniz.digerini degil.
 Vi'da biçimleme komutu :%s/ / /gc'dir. Yüzde isareti tüm
dosya analamini tasir?? ve herhangi uygun bir diziyle yer degistirebilir.
Örnein vim'de shift v yazdiginizda bir bölgeyi isaret eder ve
sonra biçimlemeyi sadece  bu bölge üzerinde yapar.
Burada vim hakkinda daha fazla birsey aciklamayacagim bu konu kendi üstünde
bir konu olacaktir. "gc" etkilesimli sürümdür. Etkilesimsizlik
s/ / /g.
 Etkilesimlilik degisimi calistirmak için herbir eslemede sevk
edilip edilmedigidir.
 Perlde sunu kullanabilirsiniz
 perl -pe 's/ / /g' Beraber birkac örnege bakalim. Sirketimizdeki sayim plani degisti
ve bütün 1 ile baslayan telefon numaralarina ikinci rakamdan
sonra 2 konuldu. Bunun anlami örnegin 1423 yerine 14223 olmali:
 Eski liste:
Telefon Isim Kimlik
     ...
3412    Bob 123
3834  Jonny 333
1248   Kate 634
1423   Tony 567
2567  Peter 435
3567  Alice 535
1548  Kerry 534
     ...Buradaki nasil yapildigidir. vi:    s/^\(1.\)/\12/g
emacs: ^\(1.\)   replaced by  \12
perl:  perl -pe 's/^(1.)/${1}2/g' phonelist.txt
Simdi yeni telefon listesi sunun gibidir.
Telefon Isim Kimlik
     ...
3412    Bob 123
3834  Jonny 333
12248   Kate 634
14223   Tony 567
2567  Peter 435
3567  Alice 535
15248  Kerry 534
     ...Perl sadece 1'den 9'a hafiza degiskenlerinin  daha fazlasini ele alabilir.
Bu nedenle \12 tabii ki bos olan12. degiskenin yerinedir. Bunu çözmek
için sadece Perl ${1}'i kullanmamiz gerekir.Simdi listedeki düzenleme karismistir. Bunu nasil belirleyebilirsiniz?
Sadece 5. konumda bir bosluk varsa  bunu test edebilirsiniz ve bir
digerini koyarsiniz:
 vi:     s/^\(....\) /\1  /g
emacs:  '^\(....\) '  '\1  ' ile yer degismistir.
perl:   perl -pe 's/^(....) /${1}  /g' phonelist.txt
Simdi telefon listesi suna benzer
Telefon Isim Kimlik
      ...
3412     Bob 123
3834   Jonny 333
12248   Kate 634
14223   Tony 567
2567   Peter 435
3567   Alice 535
15248  Kerry 534
      ...Bir meslek arkadasim  elle, listeyi yazfi ve kazara birkaç
bosluk koydu. Bunlari nasil uzaklastýrabiliriz?Telefon Isim Kimlik
      ...
3412     Bob 123
     3834   Jonny 333
12248   Kate 634
14223   Tony 567
 2567   Peter 435
3567   Alice 535
  15248  Kerry 534
      ...
Bu düzeltmeli:
vi:     s/^  *//  (a +'ya sahip olmadiginiz ii bosluk var)
emacs:  '^ +'  bos seritle yer degistirmistir. 
perl:   perl -pe 's/^ +//' phonelist.txtBir program yaziyorsunuz ve temp ve temporary gibi iki degiskeniniz var
. Simdi counter adi verilen degisken ile temp'i yer degistirmek istiyorsununz
Eger tem seriti counter ile henüz yer degistirdiyse temporary gercekten
istedigimiz olmayan counterory olur. Düzenli ifadeler bunu yapabilir. Sadece temp [^o]) counter\1 ile
yer degistirebilir. Bu temp ve o harfi degil.(Seçime bagli bir çözüm
sinirlari kullanmak için olcaktir, fakat henüz anchoring yapilarinin
bu çesidini tartismadik. 
 Umut ederim ki bu makale sizin ilginizi çekecektir. Simdi kilavuz
sayfalatina bakmak ve gözde yazim islemcilerinizin belgelerine bakabilirsiniz
ve detaylari ögrenebilirsiniz.
Ayrica e.g gibi birçok özel karakter vardir. .
  
 Iyi eglenceler, mutlu yazimlar  |