Etiketler

Youtube Kanalıma Abone Olunuz

6 Ocak 2008 Pazar

Perl'de Regular Expressionlar 2

Yazının 1. Bölümü

Herhangi bir rakam ya da harf

/a[0123456789]b/
böyle bir kodu daha önceden öğrenmiştik. a ile başlayıp ardından bir rakam ve ardından b. Bunu ifade etmemin birbaşka yolu

/a[0-9]b/
dir. [0-9] ifadesi 0 dan 9 a kadar rakamlardan herhangi biri demektir. Aynı şekilde
[a-z] ile küçük harfleri, [A-Z] ile de büyük harfleri ifade ederiz. Dikkat Yalnızca İngilizce harfler geçerlidir.

/[a-z][a-z]/
küçük harfli, 2 harfli herhangi bir kelimeyi ifade eder.

/[0-9a-zA-Z]/ 
bir karakterlik büyük ya da küçük harf yada rakamdan oluşur.

/\$[A-Za-z][_0-9a-zA-Z]*/
ifadesi perlde değişken tanımını ifade eder. $ ile başlar 2. karakter bir harf olmak zorunda, sonraki gelenler ise _ , rakam ya da harften 0 ya daha fazla.

^ ve $ karakterleri

Aradığımız satırın başlangıç ve bitiş kısımlarını ifade etmek için kullanılır. ^ başlangıç, $ bitiş karakteri tanımlaması içindir


/^abc/
abc ile başlayan satırı ifade eder.

/dir$/
sonu dir ile biten satırı tarif eder.

/^bugün$/ 
yalnızca bugün kelimesini ifade eder.
daha önceki perl değişken tanımlaması yetersiz kalmıştı şimdi

/^\$[A-Za-z][_0-9a-zA-Z]*$/
ile başlangıç ve bitiş karakterlerini sabitlemiş oluk.

\b ve \B karakterleri

Kelime sınırlarını ve içini tanımlamak için kullanılır

/\bgöz/
göz ile başlayan kelimeleri ifade eder. göz , gözlük gözlükçü gibi. sugözü kelimesinde bu ifadeyle aratacak olursak olmadığını söyler.
\b yi kelimenin sonunu tanımlamak için de kullanabiliriz.

/göz\b/
göz ile biten kelimeler. paragöz , açıkgöz, karagöz gibi.

/\bgöz\b/
yalnızca göz kelimesini ifade eder.
\B karakteri ise kelimenin bulunduğu yerin kelime içi olduğunu gösterir kelime başı ve sonu değil. \b nin tersi.

/\Bgöz/
karagöz , elagöz ... yalnız göz olamaz.

/göz\B/
gözlük , gözlükçü , gözcü ... yalnız göz olamaz.

/\Bgöz\B/
içinde göz geçen kelimeler: karagözcü , elagözlü ...gibi. göz , gözcü , akgöz gibi kelimeler kabul edilmez.

Örnek:
$metin = "sen seni bil, sen seni, sen seni bilmezsen, patlatırlar enseni";
@kelimeler = split(/ /,$metin);
foreach $klm (@kelimeler){
if ($klm =~ /\bsen/){
  $say1++;
 }
if ($klm =~ /sen/){
  $say2++;
 }
}
print "sen ile başlayan $say1 kelime var.\n";
print "içinde sen olan $say2 kelime var.";
Sonuç:
sen ile başlayan 6 kelime var.
içinde sen olan 8 kelime var.

Alternatiflerin dışındakiler

/g[üö]z/
ifadesi göz veya güz kelimelerini ifade eder

/g[^üö]z/
ifadesinde ise alternatif harfler olan ü ve ö nün dışındakileri tamsil eder. Yani 1. harfi g , 2. harfi ü ve ö nün dışında birşey 3. harf ise z.

Karakter aralığı

/[0-9]/ un herhangi bir rakama denk geldiğini öğrenmiştik bunu yerine /\d/ kullanacak olursak aynı işi görür.
Karakter aralığı tablosu
İfadeTanımlamaAralık
\dBir rakam[0-9]
\DRakam dışında bir karakter[^0-9]
\wKelime oluşturan karakterler[_0-9a-zA-Z]
\WKelime oluşturmayanlar[^_0-9a-zA-Z]
\sHerhangi boşluk: Satır sonu, satır atla, tab gibi[ \r\t\n\f]
\SBoşluklar dışında kalanlar[^ \r\t\n\f]

/[\da-z]/
herhangi bir rakam ya da küçük harf

Herhangi bir karakter

(.) nokta karakteri enter karakteri hariç herhangi bir karakteri ifade eder.

/a.c/
a ile başlayıp c ile biten 3 karakterli kelimeleri ifade eder.

/a.*c/
a ile başlayıp c ile biten herhangi bir yazı.

/C.*l.*t.*ık/
ifadesine uygun bir kelime : Cebelitarık

Olanların sayısı

+ ile 1 yada daha fazlasını, ? ile de 0 ya da 1 tanesini ifade ediyorduk. Bazen tekrar edenin kaç tane olduğunu belirlemek gerekebilir. Bunu { ve } karakterleri arasında bir rakam ile belirleriz.

/ab{1,3}c/
ile abc abbc abbbc kelimelerine uyan bir ifade yazmış olduk. ab abbbbc kelimeleri buna uymayacaktır. Yani b nin1 den 3 e kadar tekrarını tarif ettik.

/ab{3}c/
yalnızca abbbc yi tarif eder.

/ab{3,}c/
b için alt tekrar sınırı 3 , üstsınır verilmemiş. a ile başlayan En az 3 b ile devam edip c ile biten manasında.
/a{0,3}c/
a ile başlar b 3 den fazla değil ve c

/[a-z]{1,3}/ 
1 , 2 ya da 3 harfli kelime

/.{3}/ 
herhangi 3 karakterden oluşan kelime

Seçenek belirleme

karakteri ile 1 ya da daha fazla seçenek belirlenebilir.

/aliveli/
ali ya da veli den biri

/[a-z]+[0-9]+/ 
1 veya daha fazla küçük harf veya 1 ya da daha fazla rakam

Hafızaya alma

Örneğin şu şekilde vir ifade kullanmak istiyoruz - 1 ya da daha fazla rakam ya da küçük harf -> [\da-z]+ - sonra noktalı virgül ya da iki nokta -> [;:] - sonra yine 1 ya da daha fazla rakam ya da küçük harf -> [\da-z]+ - sonra noktalı virgül ya da iki nokta -> [;:] - sonra yine 1 ya da daha fazla rakam ya da küçük harf -> [\da-z]+
/Şimdi kodları birleştirelim

/[\da-z]+[:;][\da-z]+[:;][\da-z]+/ 
Gördüğünüz gibi tekrar eden ifadeler var. Perlde tekrar eden ifadeler için bir kolaylık var. İfade parentez içine alınır

([\da-z]+)
perl parantez içi ifadeyi hafızaya alır. İfade içinde bunu tekrar kullanmak istersek \n kullanarak çağırırız. n yerine hafızaya alınmış ifadelerden kaçıncısı olduğunu yazarız.

/([\da-z]+])[:;]\1[:;]\1/ 
perl \1 kodunu gördüğü yere hafızaya alınmış [\da-z]+ kodlarını ekleyecektir. Diğer tekrar edene de aynı yöntemi uygulayacak olursak

/([\da-z]+)([:;])\1\2\1/
Gördüğünüz gibi hem kod kısaldı hem de karmaşadan kurtuldu. Tarih formatında (29-06-01 gibi) bir text aratmak istersek

/(\d{2})([/-:\.])\1\2\1/
kullanabiliriz. Yalnız dikkat 28-06:01 gibi yazılmış bir kodu da bulacaktır.

Yazının 3. Bölümü

Hiç yorum yok:

Yorum Gönder