Makale RegExp (Kurallı İfadeler)

Bu Makale Yararlı Oldu mu?

  • Evet

  • Hayır


Sonuçlar yalnızca oylamadan sonra görülebilir.
Regular Expression, birçok programlama dilinde kullanılabilen, sayısal ve metinsel içeriklerde belirli kurallara uyan bölümleri bulan ifadelerdir.
“Düzenli ifade” ile Türkçe karşılığını kullananlar olsa da bazı sözlüklerde karşılığı “kurallı ifadeler” olarak belirtilmektedir ve doğru olan da budur..

Nerelerde Kullanılır?
Tanımda da bahsettiğimiz gibi birçok programlama dili (Perl, PHP , Java, Javascript, .Net …), işletim sistemi komutları, veritabanı sorguları, arama/değiştirme amaçlı uygulamalarda kullanılır. Genelde ortak standart yazım kuralları olmasına karşın, kullanıldığı yerlere göre farklı ifadelerle de kurallı ifadeler oluşturulmaktadır.

Pattern Elemanları

Karakter

Açıklama

\

Kaçış karakteri olarak nitelendirilebilir. Regexp de pattern yazarken bazı pattern değerleri önceden tanımlı olduğu için bunları etkisizleştirmeye ve pattern içinde arama özelliği olarak kullanmaya yarayan karakterdir.

^

Ifade başlangıcı olduğunu belirtir.

$

Ifade ya da satır sonu olduğunu belirtir.

[]

Karakter aralığı belirlemede kullanılır. Örn: [a-z]

()

Alt desen belirlemek için kullanılabilir. Örn: (\w)

{}

Alt ve üst limit belirleyerek sabit sayıda karakter girişini sağlar. Örn: {n},{n,},{n,n}

.

Herhangi bir karakterin gelebileceği anlamına gelir

?

Önüne gelen karakter sayısından en fazla 1 en az 0 değerinde olacağını belirtir. Örn: \d?

*

0 veya daha fazla karakter gelebilir anlamına gelmektedir. Örn : \w*

+

1 veya daha fazla karakter gelebilir anlamına gelmektedir. Örn : \w+

|

Birden fazla karakter grubunda bir veya bir kaçının olabileceği anlamına gelmektedir. Örn : a|S|d



Desenlerimizde kullababileceğimiz hazır olarak tanımlanmış karakter setleri bulunmaktadır..
Bunları da şu şekilde sıralayabiliriz..

Karakter

Açıklama

\w

Sadece alfanümerik değerlerin gelebileceğini belirtir. Örn: [a-zA-Z0-9_]

\W

Alfanümerik olmayan değerlerin gelebileceğini belirtir. Örn: [^a-zA-Z0-9_]

\s

Boşluk karakterlerini ifade eder. Örn: [\f\n\r\t\v]

\S

Boşluk karakteri olmayan karakterleri ifade eder. Örn: [^\f\n\r\t\v]

\d

0-9 arasında tek bir sayının olacağını ifade eder. Örn: [0-9]

\D

Rakam olmayan tek bir karakteri ifade eder. Örn: [^0-9]

\b

Bir kelimenin belirtilen dizi ile sonlanmasını ifade eder. Örn: \w+\.asp\b

\B

Bir dizinin başında veya sonunda olmaması gereken karakterleri ifade eder. Örn : \w+\.asp\B

\n

Yeni satır karakterini ifade eder.

\t

Tab karakterini ifade eder.

\r

Satır başı karakterini ifade eder.

\f

Sayfa ilerletme karakterini ifade eder.

\v

Dikey tab karakterini ifade eder.

\num

Desen içinde yer alan ifade karşılıklarını kullanmamıza yarar. Örn: <(b)>(.*)<\/\1>

\xn

Onaltılık(hexdecimal) sistemdeki bir karakteri ifade eder. Örn: \x 40 ifadesi bana @ işaretini verir.




RegExp Özellikleri

Global
Boolean
bir değer alır ve aramanın nasıl yapılacağını belirler.
True yada False değeri alır.
Eğer True olursa String içindeki tüm uyumlar aranır.
False olursa sadece ilk uyum aranır.
Doğal olarak geriye tek bir sonuç döner.


IgnoreCase
Aramada küçük büyük harf duyarlılığını belirler.
True yada False değeri alır.
True olursa aramada küçük büyük harf uyumu gözetilmez.
False olursa küçük büyük harf uyumu gözetilir.


Pattern
RegEx'
in verilen String içinde arayacağı deseni belirler.
Bu desen bir yada daha çok harf yada sayıdan oluşan bir kelime yada cümle olabilir Veya en sonda pattern tanımlama bölümünde de işleyeceğimiz gibi karmaşık yapıdan oluşan bir arama deseni de olabilir.
RegExp.Pattern = "(www|[URL]http://|ftp|file://)S+[/URL]" gibi...


RegExp Metodları

Execute
Aramayı yürütmeye ve sonuçları her bir sonuç için bir match nesnesi oluşturup bunları bir matches koleksiyonuna eklemeye yarar.


Replace
Aramada bulunan metni yer değiştirmek için kullanılır.
MsgBox RegExp.Replace(String1,String2) şeklinde kullanılıyormuş.


Test
Arama yapıp sonuçlarını bir matches nesnesine atamadan önce stringimiz içinde desenimizin olup olmadığını sınar.
Yani bir nevi arama yapar ama sonuçları Matches nesnesine atmaz.
Sadece eğer aranan desen String içinde varsa True yoksa False değeri döndürür.
MsgBox RegExp.Test("içinde arama yapılacak string")


Eğer aranan desen String içinde varsa Sonuc değeri True, yoksa False olarak döner.
Bunu nasıl kullanabilirsiniz, meselâ bir e-mail adresi deseni tanımlayıp eğer sonuç True dönüyorsa e-mail adresini doğru kabul eder, değilse kullanıcıya bu mail adresinin geçersiz olduğunu bildirirsiniz.

RegExp ile ilgili gerekli bilgiyi aldıktan sonra şimdi de arama sonuçlarını nasıl değerlendirebileceğimizi görelim.


Match ve Matches Nesneleri

Matches nesnesi aslında Match nesnelerinin bir koleksiyonudur.
Bir ya da daha fazla Matches nesnesini içinde bulundurur.
Bir Matches koleksiyonu daha doğrusu Match nesneleri RegExp'in Execute metoduyla oluşturulur.
Bir Match nesnesi bulunan her bir arama sonucunu bulundurur.


Matches Nesnesi Özellikleri

Count
Toplam kaç tane arama sonucu olduğunu bize bildirir.
VBA:
Function RegEx(desen,MyString)
    Dim RegExp As Object
    Set RegExp = New RegExp
    RegExp.Pattern = desen
    RegExp.IgnoreCase = True
    RegExp.Global = True
    Set Matches = RegExp.Execute(MyString)
    RegEx = Matches.Count
End Function
Msgbox RegEx("a", "arama arama benden akıl arama")

Bize 10 değerini döndürür. Çünkü aradığımız "a" harfi "arama arama bende akıl arama" String içinde 10 tane bulunuyor.

Item
Matches
koleksiyonundan anahtarı verilen arama sonucunu bize getirir.
Ya da anahtarı verilen maddeye yeni değer atanabilir.
MsgBox Matches.Item(i)

i yukarda ki örneğimize göre 0 ile 9 arası bir tam sayı olabilir.
10 tane sonucumuz var neden 9´a kadar derseniz bildiğiniz gibi dizilerde eleman sayısı 0´dan başlar ve yine yukarıdaki örneğimize göre tüm Item değerleri bize "a" sonucunu döndürecektir. Çünkü; aradığımız desen basit ve sadece "a" harfini arıyoruz. Dolayısıyla tüm arama sonuçları bize "a" olarak dönecektir. Eğer kompleks bir desen ifade etseydik bu Item değerleri değişirdi. Kompleks bir desen nasıl ifade edilir.. en sonda. ;)


Match Nesnesi Özellikleri

VBA:
Dim RegExp,Matches
Set negExp = New RegExp
RegExp.Pattern = "aranacak kelime"
RegExp.IgnoreCase = True
RegExp.Global = True
Set Matches = RegExp.Execute("içinde arama yapılacak string")
i = 1
For Each Match In Matches
    Msgbox  "Arama sonuçlarında " & i & ". sonuç baştan " & Match.FirstIndex & " harften başlıyor."
    Msgbox  "Uzunluğu " & Match.Length & " karakter."
    Msgbox  "Sonuç değeri " & Match.Value
    i = i + 1
Next Match
Match nesnesi bulunan arama sonucudur ve aşağıdaki özellikleri bulunur;

FirstIndex
Arama sonucunun baştan kaçıncı karakterden başladığını verir. Soldan ilk karakter 0´dan başlar.
Match.FirstIndex


Length
Arama sonucunun text uzunluğunu döndürür.
Yukarda sadece "a" harfini aradığımız örnekte tüm Length değerleri 1 olur.
Ancak kompleks desen tanımlamalarında bu değer her arama sonucu için değişebilir.
Match.Length


Value
Arama sonucunun değerini döndürür.
Aslında arama sonuç değeri için Match.Value demek çok da gerekli değildir.
Match.Value yerine sadece Match demeniz de size arama sonuç değerini verir.
Yukarıdaki örneğe göre; Msgbox "Sonuç değeri " & Match.Value ile MsgBox "Sonuç değeri " & Match aynı kapıya çıkar.


RegExp'de Pattern Tanımlama

5,7 gibi bir sayıyı RegExp ile aşağıdaki gibi ifade ederiz.

/d*.d+/

Kurallı ifadeler / ile başlayıp / ile biter.

Karakter

Anlamı

d

0 ile 9 arası bir rakamı gösterir.

*

0 veya daha fazla demektir.

.

. (nokta) manasın dadır.

+

1 veya daha fazla demektir.




Desenler
Desen bir karakter dizilimi için oluşturulan sınama kriterleridir.
Yukarıdaki /d*.d+/ 5,7 için oluşturulmuş bir desendir.


Değiştiriciler
Arama için desenlere eklenebilecek bazı değiştiriciler bulunur. Bu değiştiriciler sondaki / işaretinden sonra yazılırlar. Mesela /metin/ desenini bir string içinde arayacakken aşağıdaki değiştiricileri ekleyerek arama seçeneklerini artırabiliriz.

Desen

Anlamı

/metin/g

Genel uyum(yazıldığı gibi)

/metin/i

Küçük büyük harf duyarsız

/metin/m

Dizilim içinde çoklu karşılaştırmalar için $ ve ^ özel karakterlerine izin verir

/metin/s

Satırbaşı (newline) karşılaştırmaları için . Özel karakterine izin verir

/metin/x

Desendeki beyaz boşlukları (whites_paces) göz ardı eder.



Birden çok değiştirici birbirini / işaretleri ile izleyebilir.

/metin/m/i/s


Meta karakterler
Meta karakterler işaretinden sonra gelen ve deseni tanımlarken bize seçenek sağlayan özel karakterlerdir.

Karakter

Anlamı

s

Sekme veya satırbaşı gibi beyaz boşluklar (whitespaces)

S

Beyaz boşluklar dışındaki tüm karakterler

Sözcük bağlayıcısı

B

Sözcük olmayan bağlayıcılar

d

0-9 arasındaki bir rakam

D

Sayısal olmayan karakterler

w

Harfler, rakamlar veya altçizgi

W

Harf, rakam veya altçizgi dışındaki tüm karakterler

A

Bir karakter diziliminin başı

Bir karakter diziliminin sonu




Özel Karakterler
Meta karakterler gibi bize desenimizi tanımlamamızda süzme görevi sağlayan özel karakterlerdir. / işaretinden sonra gelmezler.

Karakter

Anlamı

*

Önünde bulunan karakterin sıfır veya daha çok tekrarlanacağını ifade eder.

+

Önünde bulunan karakterin bir veya daha çok tekrarlanacağını ifade eder.

?

Herhangi bir karakterin sıfır veya daha çok tekrarlanacağını ifade eder.

.

Satırbaşı (newline) karakteri hariç herhangi bir karakteri ifade eder.

^

A meta-karakteri gibi bir karakter diziliminin başını gösterir.

$

Meta-karakteri gibi bir karakter diziliminin sonunu gösterir.




Burada görüldüğü gibi * , + , ? , . , ^ , $ işaretlerini kendi manalarında, yani; özel karakter olarak değil de mesela . yı nokta olarak ifade etmek için önüne ters bölü (\.) konmalıdır.

Artık bunları da öğrendikten sonra, yavaş yavaş desen kullanarak bir şeyler yapmaya başlayabiliriz. (y)


Örnek Kullanım
VBA:
Sub TC_Kimlik_Ayir()
    Dim Reg As Object, i As Integer
    Range("B1:B4").ClearContents
    Set Reg = CreateObject("VBScript.RegExp")
    Reg.Global = True
    Reg.Pattern = "([0-9]{11})"
    For i = 1 To Range("A65536").End(3).Row
        Cells(i, 2) = Reg.Execute(Cells(i, 1)).Item(0)
    Next i
    i = Empty: Set Reg = Nothing
End Sub
Ek'teki dosyalarda birçok örnek kullanım da mevcut, faydalanabilirsiniz.

Saygılar
 
Admin

Yorumlar

Üst Alt