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.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 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.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.
Ç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 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 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.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
|