Forum
Pattern Elemanları
\ | 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;
\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çinde ki 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
RegExp´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| http://|ftp|file://)S +" 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. Nasıl kullanıldığını örneğimizde gördünüz.
Replace
Aramada bulunan texti yer değiştirmek için kullanılır. Açıkcası kitaplarda böyle yazmasına rağmen nasıl kullanıldığına dair henüz bir örnek bulamadım.
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. Mesela bir email adresi deseni tanımlayıp eğer sonuç true dönüyorsa email 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 yada 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.
Function RegEx(desen,MyString)
Dim RegExp
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 bende akıl arama")
Bize 10 değerini döndürür. Çünkü aradığımız "a" harfi "arama arama bende akıl arama" stringi içinde 10 tane bulunuyor.
Item
Matches koleksiyonundan anahtarı verilen arama sonucunu bize getirir. Yada 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 yukarda ki ö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
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 nesnesi bulunan arama sonucudur. Ve aşağıda ki ö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 çokta gerekli değildir. Match.Value yerine sadece Match demenizde size arama sonuç değerini verir. Yukarda ki ö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+/
Düzenli ifadeler / ile başlayıp / ile biter.
d ==> 0 ile 9 arası bir rakamı gösterir.
* ==> 0 veya daha fazla demektir.
. ==> . (nokta) manasındadır.
+ ==> 1 veya daha fazla demektir.
Desenler
-----------------------
Desen bir karakter dizilimi için oluşturulan sınama kriterleridir. Yukardaki /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.
/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.
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.
* Ö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.
Burda görüldüğü gibi * , + , ? , . , ^ , $ işaretlerini kendi manalarında yani özel karakter olarak değilde 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.
ÖRNEKLER;
■ Hücredeki rakamları sayma
Sub Rakam_Say()
Dim Reg As Object
Dim i As Integer
Set Reg = CreateObject("VBScript.RegExp")
Reg.Global = True
Reg.Pattern = "\d"
For i = 2 To Range("A65536").End(3).Row
Set say = Reg.Execute(Cells(i, 1))
If say.Count > 0 Then
Cells(i, 2) = Reg.Execute(Cells(i, 1)).Count
End If
Next i
i = Empty: Set Reg = Nothing
End Sub
■ Hücredeki harfleri sayma
Sub Harf_Say()
Dim Reg As Object
Dim i As Integer
Set Reg = CreateObject("VBScript.RegExp")
Reg.Global = True
Reg.Pattern = "[^0-9,]"
For i = 2 To Range("A65536").End(3).Row
Set say = Reg.Execute(Cells(i, 1))
If say.Count > 0 Then
Cells(i, 3) = Reg.Execute(Cells(i, 1)).Count
End If
Next i
i = Empty: Set Reg = Nothing
End Sub
■ T.C. Kimlik Numarası Ayırma
Sub TC_Kimlik_Ayir()
Dim Reg As Object
Dim 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
■ Mail adresi ayırma
Sub Mail_Ayir()
Dim Reg As Object
Dim Evn As Range
Application.ScreenUpdating = False
Range("E1:E100").ClearContents
Set Reg = CreateObject("VBScript.RegExp")
Reg.Global = True
Reg.Pattern = "[a-z-0-9]*(@\D*)"
For Each Evn In Range("A1:D20")
Set say = Reg.Execute(Evn.Value)
If say.Count > 0 Then
Range("E65536").End(3)(2, 1) = Reg.Execute(Evn.Value).Item(0)
End If
Next Evn
Set Evn = Nothing: Set Reg = Nothing
End Sub
■ [b]Rakamları[/b] ayırma
Sub Rakam_Ayir()
Dim RegEx As Object, RegMatchCollection As Object, RegMatch As Object
Dim Myrange As Range, C As Range, OutPutStr As String
Set RegEx = CreateObject("vbscript.regexp")
With RegEx
.Global = True
.Pattern = "\d+"
End With
Set Myrange = Range("B3:B8")
For Each C In Myrange
OutPutStr = ""
Set RegMatchCollection = RegEx.Execute(C.Value)
For Each RegMatch In RegMatchCollection
OutPutStr = OutPutStr & RegMatch
Next
C.Offset(0, 1) = OutPutStr
Next
Set RegMatchCollection = Nothing
Set RegEx = Nothing
Set Myrange = Nothing
End Sub
■ [b]Ad Soyad yer değiştirme[/b]
Sub Ad_Soyad_Yer_Degistir()
Dim RegEx As Object, RegMatchCollection As Object
Dim Myrange As Range, C As Range, OutPutStr As String
Dim i As Long
Set RegEx = CreateObject("vbscript.regexp")
With RegEx
.Global = True
.IgnoreCase = True
.Pattern = "[a-z]+"
End With
Set Myrange = Range("B13:B18")
For Each C In Myrange
OutPutStr = ""
Set RegMatchCollection = RegEx.Execute(C.Value)
If RegMatchCollection.Count > 0 Then
OutPutStr = ""
For i = RegMatchCollection.Count - 1 To 0 Step -1
OutPutStr = OutPutStr & " " & RegMatchCollection(i)
Next
C.Offset(0, 1) = OutPutStr
End If
Next
Set RegMatchCollection = Nothing
Set RegEx = Nothing
Set Myrange = Nothing
End Sub
■ [b]E-Mail Doğrulama[/b]
Sub E_Mail_Dogrulama()
Dim RegEx As Object
Dim Myrange As Range, C As Range
Set RegEx = CreateObject("vbscript.regexp")
Set Myrange = Range("G3:G8")
With RegEx
.MultiLine = False
.Global = False
.IgnoreCase = True
.Pattern = "^([a-z0-9_\.\-]+)\@(([a-z0-9\-]+\.)+)([a-z]+)$"
End With
For Each C In Myrange
If RegEx.Test(C) = True Then
C.Offset(0, 1) = "Doğru"
C.Offset(0, 2) = RegEx.Replace(C, "$1")
C.Offset(0, 3) = RegEx.Replace(C, "$2")
C.Offset(0, 4) = RegEx.Replace(C, "$4")
Else
C.Offset(0, 1) = "Yanlış"
End If
Next
Set Myrange = Nothing
Set RegEx = Nothing
End Sub
■ [b]Tekrarlananları kaldırma[/b]
Sub Tekrarlananlari_Kaldir()
Dim RegEx As Object
Dim Myrange As Range, C As Range
Set RegEx = CreateObject("vbscript.regexp")
Set Myrange = Range("B33:B38")
With RegEx
.MultiLine = False
.Global = True
.IgnoreCase = True
.Pattern = "\b(\w+)\b(\s+\1\b)+"
End With
For Each C In Myrange
C.Offset(0, 1) = RegEx.Replace(C, "$1")
Next
Set Myrange = Nothing
Set RegEx = Nothing
End Sub
■ [b]Kelime[/b] ayırma
Sub Kelime_Ayir()
Dim RegEx As Object, RegMatchCollection As Object, RegMatch As Object
Dim Myrange As Range, C As Range, OutPutStr As String
Set RegEx = CreateObject("vbscript.regexp")
With RegEx
.Global = True
.Pattern = "[^0-9,]"
End With
Set Myrange = Range("G23:G28")
For Each C In Myrange
OutPutStr = ""
Set RegMatchCollection = RegEx.Execute(C.Value)
For Each RegMatch In RegMatchCollection
OutPutStr = OutPutStr & RegMatch
Next
C.Offset(0, 1) = OutPutStr
Next
Set RegMatchCollection = Nothing
Set RegEx = Nothing
Set Myrange = Nothing
End Sub
■ [b]Plâka[/b] ayırma
Sub Plaka_Ayir()
Dim RegEx As Object, RegMatchCollection As Object, RegMatch As Object
Dim Myrange As Range, C As Range, OutPutStr As String
Set RegEx = CreateObject("vbscript.regexp")
With RegEx
.Global = True
.Pattern = "([0-9]{2})([A-Z]{1,3})([0-9]{2,4})"
End With
Set Myrange = Range("G33:G38")
For Each C In Myrange
OutPutStr = ""
Set RegMatchCollection = RegEx.Execute(C.Value)
For Each RegMatch In RegMatchCollection
OutPutStr = OutPutStr & RegMatch
Next
C.Offset(0, 1) = OutPutStr
Next
Set RegMatchCollection = Nothing
Set RegEx = Nothing
Set Myrange = Nothing
End Sub
Hoşça kalın !
Paylaşım için teşekkürler.
1984 doğumluyum. 4 yaşından bu yana İstanbul’da yaşıyorum. Sırası ile aşağıdaki okullarda eğitim gördüm. Paşaköy ilkokulu (1990-1995) Kartal Zekeriyya Güçer İlköğretim Okulu(1995-1998) Ümraniye Teknik ve Endüstri Meslek Lisesi Bilgisayar Bölümü(1998-2001) Kocaeli Üniversitesi Bilgisayar Programcılığı(2002-2004) Anadolu Ünv. İşletme Fakültesi(2006-2009) Lise yıllarından sonra bir bilgisayar firmasının teknik servisinde mesleğe merhaba dedim. Outsource olarak Citibank ytl ve bina taşınma projesinde yer alarak 8 ay görev yaptım. Bu görevden sonra şu an çalışmakta olduğum yerde bilgi işlem sorumlusu olarak göreve başladım ve 18 yıldır görevimin başındayım.
Rica ederim [b]Rıza Bey[/b], iyi akşamlar.
Paylaşım için teşekkürler.
makale tadında olmuş emeğinize sağlık.
ProfectSoft Yazılım ve Danışmanlık Hizmetleri
LogPusher & Bifyou E-Commerce System
www.profectsoft.com
Faydalı olması dileğiyle...