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 Örnek
Bir 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.txt
Kelimelerle 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 Yapilar
Bir 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.txt
Bu 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.txt
13,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.txt
Ikinci 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.txt
Bu satir sonunda 567 numarali satirlari arar.
Çogalticilar
Bir ç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 Parantezler
Bir hafiza olarak parantezler ifadenin yöntemini degistirmez, fakat
sebeplerin yerine sonradan tercih edilsin diye ilistirilmis metin parcasi
hatirlanmali
Hatirlanan 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 Kullanimi
Yazim 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.txt
Bir 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 |