Forum

RegExp (Düzenl...
 
Bildirimler
Hepsini Temizle

RegExp (Düzenli İfadeler) ile İlgili Açıklamalar ve Örnekler

6 Yazılar
4 Üyeler
0 Likes
5,706 Görüntüleme
(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

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")
 
1
 
For Each Match In Matches
Msgbox  
"Arama sonuçlarında " ". sonuç baştan " Match.FirstIndex " harften başlıyor."
Msgbox  "Uzunluğu " Match.Length " karakter."
Msgbox  "Sonuç değeri " Match.Value
 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 
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 2 To Range("A65536").End(3).Row
    Set say 
Reg.Execute(Cells(i1))
        If 
say.Count 0 Then
            Cells
(i2) = Reg.Execute(Cells(i1)).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 2 To Range("A65536").End(3).Row
    Set say 
Reg.Execute(Cells(i1))
        If 
say.Count 0 Then
            Cells
(i3) = Reg.Execute(Cells(i1)).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)(21) = Reg.Execute(Evn.Value).Item(0)
        
End If
    
Next Evn
    Set Evn 
NothingSet Reg Nothing
End Sub

 [b]Rakamları[/b] ayırma

Sub Rakam_Ayir()
Dim RegEx As ObjectRegMatchCollection As ObjectRegMatch As Object
Dim Myrange 
As RangeAs RangeOutPutStr 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(01) = 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 ObjectRegMatchCollection As Object
Dim Myrange 
As RangeAs RangeOutPutStr 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 RegMatchCollection.Count 1 To 0 Step -1
                OutPutStr 
OutPutStr " " RegMatchCollection(i)
            
Next
            C
.Offset(01) = 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 RangeAs 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(01) = "Doğru"
            
C.Offset(02) = RegEx.Replace(C"$1")
            
C.Offset(03) = RegEx.Replace(C"$2")
            
C.Offset(04) = RegEx.Replace(C"$4")
        Else
            
C.Offset(01) = "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 RangeAs 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(01) = RegEx.Replace(C"$1")
    
Next
    Set Myrange 
Nothing
    Set RegEx 
Nothing
End Sub

 [b]Kelime[/b] ayırma

Sub Kelime_Ayir()
Dim RegEx As ObjectRegMatchCollection As ObjectRegMatch As Object
Dim Myrange 
As RangeAs RangeOutPutStr 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(01) = 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 ObjectRegMatchCollection As ObjectRegMatch As Object
Dim Myrange 
As RangeAs RangeOutPutStr 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(01) = OutPutStr
    Next
    Set RegMatchCollection 
Nothing
    Set RegEx 
Nothing
    Set Myrange 
Nothing
End Sub

Hoşça kalın ! --)(

 
Gönderildi : 16/11/2013 18:05

(@www-rizasahan-com)
Gönderiler: 18028
_
 

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.

 
Gönderildi : 17/11/2013 00:19

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Rica ederim [b]Rıza Bey[/b], iyi akşamlar. 

 
Gönderildi : 17/11/2013 01:19

(@mustafacagricaliskan)
Gönderiler: 58
Trusted Member
 

Paylaşım için teşekkürler.

 
Gönderildi : 17/11/2013 06:16

(@eravse)
Gönderiler: 1753
Üye
 

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

 
Gönderildi : 03/10/2014 01:40

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Faydalı olması dileğiyle... --)( 

 
Gönderildi : 16/01/2015 04:01

Paylaş: