|
| Ana Sayfa | Dersler | Download | Forum |Bize Ulaşın |Siteni Ekle | Ziyaretçi Defteri |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
LİNUX ÜSTÜNDE .NET Regular Expressions Bileşen Tabanlı Programlama I Bileşen Tabanlı Programlama II Bileşen Tabanlı Programlama III |
Düzenli İfadeler - Regular Expressions Bu yazımızda Regular Expressions yani Türkçe karşılığı ile düzenli ifadeler konusuna değineceğiz. Düzenli ifadeler, kısaca bir metin üzerinde çeşitli işlemler yapmaya yarayan yardımcı bir araç olarak açıklanabilir. Bu konuyu anlatmaya devam ederken içerisinde sıkça geçecek olan “RegExp” adlı (Regular Expressions ifadesinin kısaltılmış hali) ifadeyi kullanacağım. İlk başlarda regexp kullanırken oldukça zorlanabilirsiniz. Hatta bu işlemler sizi o kadar sıkabilir ki bıkma noktasına gelebilirsiniz. Ama bence vazgeçmemek en güzeli. Çünkü regexp ile işlem yapmak, alıştıktan sonra hem çok zevkli hemde oldukça vakit kârı sağlayan bir iş. Açıkça söylemek gerekirse, şu anda ben bile sıkça regexp ile işlemler yapmama rağmen bir hayli zorlanıyorum.. “Pattern yazmak bence başlı başına bir sanat.” Artık regexp hakkında azda olsa bir bilgi sahibiyiz.Şimdi regexp’nin işleyiş tarzına gelelim.. RegExp ile fonksiyonlar yazarken bunun bazı nimetlerinden yararlanacağız. Bunlar aşağıdaki şekildedir; Özellikler Pattern : Verilen ifade içinde aranacak olan desen olarak özetlenebilir. Bu desenler basit olabileceği gibi karmaşık ve uzun bir yapıya sahip olabilirler. Örn : *.Pattern = “[^a-zA-Z0-9]” Global : Aramanın nasıl yapılacağını belirler ve Boolean bir değer alır. Eğer True olarak değer verilmişse, arama içindeki tüm uyumlara bakılır, False olarak değer verilmişse sadece ilk uyum aranır. Örn : *.Global = True / False IgnoreCase : Arama yaparken ifadelerde büyük / küçük harf uyumuna bakar ve Boolean bir değer alır. True değer verildiği taktirde aramada büyük / küçük harf uyumuna bakılmaz, False değer verilmişse aramada büyük / küçük harf uyumu aranır. Örn : *.IgnoreCase = True / False Methodlar Execute : Yapılacak olan işlemin çalıştırılması için gerekli olan bir methoddur. Text : Bu methodu kontrol mekanizması olarak adlandırabiliriz.. Arama yapılacak ifade içinde gerekli uyum varsa True yok ise false değer döndürür. Replace : Bu method ise vbscriptte kullandığımız “replace” fonksiyonuna benzer. Aranan ifade işleminde desen doğrulanıyorsa gerekli değiştirme işlemi yapılır. Not : Methodlar hakkında detaylı bilgi aşağıda örnekli anlatımlarda daha uzun olarak belirtileceklerdir. Yukarıda bahsettiğimiz özellikler ve methodlar haricinde, girilen bir karakter dizisinin, oluşturulan desene uyup uymadığını belirlemek için, yine aynı isim alanı altında bulunan “Match” adında nesneden faydalanılır. Bunun sonucunda ise az sonra aşğıda göreceğimiz bu “Match” nesnesine ait özellikler kullanılabilir. Match Nesnesine Ait Özellikler Count : Verilen ifade içinde arama sonucunda uyumlu ne kadar değer bulunduğunu ifade eder. Örn : Response.Write *.Count Item : Kullanımı SubMatches özelliğine benzer. Örn : Response.Write *.Item(x) Matches Nesnesine Ait Özellikler Bu özellik arama sonucunda bulunan değerleri ifade eder.
Value :
Verilen ifade içinde arama sonucunda dönen değer(ler) dir. Örn : Response.Write *.Value Length : Verilen ifade içinde arama sonucunda dönen değerin uzunluğunu verir. Örn : Response.Write *.Length
FirstIndex :
Verilen ifade içinde arama sonucunda dönen değerin baştan kaçıncı
karakterden başladığını verir Örn : Response.Write *.FirstIndex SubMatches
Verilen ifade içinde arama sonucunda dönen değer dizi değişken olarak
gelmiş ise bunu kullanmamıza yarayan özelliktir. Örn : Response.Write *.SubMatches(0 / 1 / 2) Evet bunlarıda burda kısaca açıkladıktan sonra sıra geldi pattern(desen) nasıl yazılır, yazılırken nelere dikkat etmeliyiz gibi soruların cevabına. Pattern Elemanları
Desenlerimizde kullababileceğimiz hazır olarak tanımlanmış karakter setleri bulunmaktadır.. Bunlarıda şu şekilde sıralayabiliriz.
Artık bunları da öğrendikten sonra yavaş yavaş desen kullanarak birşeyler yapmaya başlayabiliriz. Forumlarda sıkça karşılaştığım sorulardan örnekler vererek desenlerimizi yazmaya çalışacağım.. Örnek 1 :
<%
Function LinkYap(GelenVeri)
.Global =
True End With For Each Degerler In objReg.Execute(GelenVeri) GelenVeri = Replace(GelenVeri,Degerler,"<a target='_blank' href='"& Degerler.SubMatches(0) &"'>"& Trim(Degerler.SubMatches(2)) &"</a>", 1,-1,1) Next
LinkYap = GelenVeri
%>
Olacaktır.
Bu örneğimizde kullandığımız
deseni kısaca açıklayalım.
Diğer tarafta ise 0 veya daha
fazla beyaz boşluk olabileceğini ve alfanumerik karakterler ile yeni
satır karakterlerinin gelebileceğini ifade ediyoruz.. Örnek 2 :
0 555 555 55 55 şeklindeki bir verinin
doğruluğunun kontrolünü yapalım.
Function
TelNoKontrol(GelenVeri) Set objReg = New RegExp With objReg
.Global = True
TelNoKontrol = Durum
Else End If
%>
Bu örneğin çıktısı “Telefon
Numarası Doğru” olacaktır Başta 1 tane sıfır sayısının olması gerektiğini ve ardından 1 tane beyaz boşluk onun artında 3 tane herhangi bir sayı ve 1 tane beyazboşluk ardından 3 tane herhangi bir sayı ve 1 tane beyaz boşluk ardından 2 tane herhangi bir sayı ve 1 tane beyaz boşluk ve ardından 2 tane herhangi bir sayı gelmesi gerektiğini söylüyoruz. Örnek 3 : <html><br><head><br><title>Bu Bir Deneme İşlemi</title><br><body>Deneme</body><br></head><br></html> şeklideki veride bulunan “<br>” tag’larını vbCrlf (enter) karakter seti ile değiştirelim <%
Function
RegReplace(GelenVeri)
End Function %>
Örneği çalıştırıp kaynak
koduna baktığınızda içeriğin, <head> <title>Bu Bir Deneme İşlemi</title> <body>Deneme</body> </head> </html> Şekilde olduğunu göreceksiniz. Burda da gördüğünüz gibi verilen text içinde “<br>” taglarını arıyor.. Örnek 4 : Bu son örneğimizi biraz geliştirelim ve döviz kurlarını alalım.. <% Session.Codepage = 1254 Response.CharSet = "ISO-8859-9" strUrl = "http://www.koc.net/finans/merkezdoviz.jsp" Function MaxiParse(Url) Set XmlHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0") XmlHTTP.Open "GET" , Url, False XmlHTTP.Send strContent = XmlHTTP.ResponseText MaxiParse = strContent End Function
Function GetirHadi(Text,Desen) Set objReg = New RegExp With objReg .Global = True .IgnoreCase = True .Pattern = Desen End With Set objContent = objReg.Execute(Text)
For Each Degerler In objContent Deger = Deger & Degerler.SubMatches(1) &"," Next GetirHadi = Deger End Function strIcerik = MaxiParse(strUrl) Isimler = GetirHadi(strIcerik,"<(td)\s+class\=\""v\"">(\s*[a-zA-Z0-9_]+((.|\n)*?)\s*)<\/\1>") Fiyatlar = GetirHadi(strIcerik,"<(td)\s+align\=right\s+class\=\""ii\"">(.+)<\/\1>") ubndIsimler = Split(Left(Isimler,Len(Isimler)-1),",") ubndFiyatlar = Split(Left(Fiyatlar,Len(Fiyatlar)-1),",") %> <div align="center"> <table border="1" width="300" id="table1" cellspacing="1" cellpadding="2" style="border-collapse: collapse"> <tr> <td width="40%" bgcolor="#0066CC"> <p align="center"><b><font face="Verdana" size="2" color="#FFFFFF">Döviz Adı</font></b></td> <td width="30%" bgcolor="#0066CC"> <p align="center"><b><font face="Verdana" size="2" color="#FFFFFF">Alış</font></b></td> <td width="30%" bgcolor="#0066CC"> <p align="center"><b><font face="Verdana" size="2" color="#FFFFFF">Satış</font></b></td> </tr> <% i = 0 For x = 0 To uBound(ubndIsimler) Response.Write "<tr><td width=""150"" bgcolor=""#FFFFCC""><p align=""right""><b><font face=""Verdana"" size=""1"">"& ubndIsimler(x) &"</font></b></td>"&_ "<td width=""75"" bgcolor=""#F1F1F1""><p align=""center""><font face=""Verdana"" size=""1"">"& ubndFiyatlar(x+i) &"</font></td>"&_ "<td width=""75"" bgcolor=""#F1F1F1""><p align=""center""><font face=""Verdana"" size=""1"">"& ubndFiyatlar(x+i+1) &"</font></td></tr>"& vbCrlf i = i + 1 Next
%> </table> </div> <% Response.Write "<p align=""center""><font face=""Verdana"" size=""1"">Coded By PsyChaos - semih[at]maxiasp[dot]com</font>" %> Bu örneğin çıktısı aşağıdaki şekildeki gibi olacaktır.
Şimdi desenimizde ne gibi özellikler kullandık onu anlatalım.. Olaya birinci desenimizi anlatarak başlayalım.
İkinci desenimizde ise birincide yaptığımız gibi gerekli alanın kopyasını çıkarıp ardından kesin olarak gelebilecek karakterler kümesini yazdım..Ardından 1 veya daha fazla karakter gelebileceğini belirttim.. Diğer yanda ise aldığımız “td” ifadesini yapıştırdım.. Bu desen ile de alış ve satış kurlarını parse ettim.. Örneklerimiz ve anlatacaklarım bu kadar. Konunun ilk başında da dediğim gibi. Başta desenler yazarken oldukça zorlanabilirsiniz. Fakat pes etmenizide istemem.. Hazır desenlerin bulunduğu http://www.regexplib.com adresine bakmanızı şiddetle tavsiye ederim.. Ayrıca yazdığınız desenlerin çalışıp çalışmadığını ya da doğru çalışıp çalışmadığını kontrol etmeniz için ise http://www.radsoftware.com.au/web/Products/RegexDesigner/ adresinden “Regular Expression Designer” adlı programı çekip kullanmanızı öneriyorum.. Herkese iyi çalışmalar dilerim. Yazar : Özcan İLHAN |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| Ana Sayfa | Dersler | Download | Forum |Bize Ulaşın |Siteni Ekle | Ziyaretçi Defteri |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Türk MCSD .NET© 2005
Siteyi en kaliteli Internet Explorer 5 ve üzeri versiyonlarinda 800 x 600 pixel çözünürlükte izlemenizi tavsiye ederiz. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||