ASP.NET'de String İşlemleri

.NET programcılığı ASP.NET'de String İşlemleri Programlama Dilleri hakkında bilgi paylaş; Bu makalemizde sizlere ASP.NET'de metin işlemlerinin nasıl yürüdüğünü elimizden geldiğince anlatmaya çalış...
Cevapla
WebMasTer SiTeSi
 
Seçenekler
  #1  
Arama 24-01-2008, 01:53
Banlı
Üyelik Tarihi: 18/09/07
Mesajlar: 1.551
 
     WS-Ticareti: (1)
Blog Yazıları: 1
Teşekkürleri: 0
20 Msg. 27 Tşkr.
Rep Gücü: 0 B737 rep gücü epey yüksek

ASP.NET'de String İşlemleri

Bu makalemizde sizlere ASP.NET'de metin işlemlerinin nasıl yürüdüğünü elimizden geldiğince anlatmaya çalışacağız. Hatırlayacağınız üzere ASP/VBScript zamanında biz bu işlemleri replace, mid, left gibi bazı fonksiyonları kullanarak yapıyorduk, ASP.NET bu fonksiyonları tamamiyle unutmuş değil, kodlarını VB.NET kullanarak yazanlar bu fonksiyonları aynı şekilleriyle kullanabilirler ama C# kullanıcıları bu fonksiyonları kullanamazlar! ASP.NET'de zaten metinlerle olan işlerimizi gerçekleştirebilmemiz için hali-hazırda bir kaç farklı sınıfımız mevcut. Şimdi bu sınıflarımıza bir göz atalım.


String
Regex
Match
Group
Capture
MatchCollection
GroupCollection
CaptureCollection

Bu sınıflarımızdan String hariç hepsi System.Text.RegularExpressions namespace'inin içinde bulunuyor, bu sınıfları kullanmak istiyorsanız bu Namespace'i eklemek zorunda değilsiniz çünkü System.Text.RegularExpressions namespace'imiz biz istesekde istemesekde bütün sayfalara otomatik olarak eklenen namespace'ler arasında.

String

Length
IndexOf
IndexOfAny
Insert
Remove
Replace
Substring
ToLower
ToUpper
Trim

Yukarıdaki liste String sınıfına ait, metin işlerken en çok kullanacağınız fonksiyonlardan bazıları, bunlar haricinde String sınıfının başka fonksiyonlarıda olduğunu unutmayın. Başlamadan önce son olarak şunu belirteyim haricini belirtmediğim mühletçe bütün fonksiyonların aramalarını "case-sensitive" yani "büyük küçük harf duyarlı" yaptığını unutmayın.

Length: Bu String sınıfının bir üyesi(Değişken), String'in uzunluğunu verir.

IndexOf: Bu fonksiyon String'in içerisinde aratacağınız harf yada kelimenin başlangıç noktasını verir. Vereceğiniz birinci parametre aratacağınız harf yada kelimeyi, ikinci parametre metnin kaç numaralı karakterinden başlanması gerektiğini, üçüncü parametresi ise kaç karakter boyunca arama yapılacağını belirtir, iki ve üçüncü parametreleri vermek zorunda değilsiniz. Aşağıdaki örneğin sonucu 4'dür.

IndexOf - C# <%@ Page Language = "C#" Debug = "True"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
string sMetin = "bir sabah, alıp seni benden gitti bu diyardan";
int i = sMetin.IndexOf("sabah");
%>
<%=i%>
</BODY>
</HTML>


IndexOf - VB.NET <%@ Page Language = "VB" Debug = "True"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Dim sMetin As String = "bir sabah, alıp seni benden gitti bu diyardan"
Dim i As Integer = sMetin.IndexOf("sabah")
%>
<%=i%>
</BODY>
</HTML>

Yukarıda ki örneklerde fonksiyonumuzun ve string.Length üyesinin nasıl kullanılacağını gördük. Burada bilmeniz gereken şey eğer sonuç pozitif bir rakam olarak dönüyorsa; aranan kelime bulunmuştur, eğer negatif olarak dönüyorsa aranan kelime bulunamamış, eğer sıfır yada fonksiyona ikinci parametre olarak verdiğiniz değer döndüyse String'in içeriği boş demektir.

IndexOfAny: String'in içerisinde, vereceğiniz bir char dizesinin içeriğindeki herhangi bir harfin olup olmadığını kontrol eder, eğer varsa size harfin başlangıç noktasını Integer olarak verir. Parametreleri IndexOf fonksiyonu ile aynıdır. Sadece fonksiyonun geri dödürdüğü değer pozitif(+1) yada negatif(-1) olabilir; sonuç pozitifse aranılan harf String içerisinde bulundu, negatif ise bulunamadı demektir. Bunu bir String'in içerisinde istemediğiniz harfleri bulmak için kullanabilirsiniz. Aşağıdaki örnek için sonuç -1 çıkmalıdır.

IndexOfAny - C# <%@ Page Language = "C#" Debug = "True"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
string sMetin = "bir sabah, alıp seni benden gitti bu diyardan";
char[] cIstenmeyen = {'#', '%', '&'};
int i = sMetin.IndexOfAny(cIstenmeyen);
%>
<%=i%>
</BODY>
</HTML>

IndexOfAny - VB.NET <%@Page Language = "VB" Debug = "True"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Dim sMetin As String = "bir sabah, alıp seni benden gitti bu diyardan"
Dim cIstenmeyen() As Char = {"#","%","&"}
Dim i As Integer = sMetin.IndexOfAny(cIstenmeyen)
%>
<%=i%>
</BODY>
</HTML>


Insert: Bu metodumuz ise String'in içerisine başka bir String'i yerleştirmeye yarar. İki parametre alır, birinci parametrede String'in nereye yerleştirileceği belirtilir, ikinci parametre ise yerlştirilecek olan String'dir. Burada bilmeniz gereken fonksiyon geriye String döndürür; geriye dönen, üzerinde işlem yapılan String'in yeni halidir!

Insert - C# <%@Page Language = "C#" Debug = "True"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
string sMetin = "bir sabah, alıp seni benden gitti bu diyardan";
string sMetin2 = ", hazin bir mektup, bir-yâdigâr kalan";
sMetin = sMetin.Insert(sMetin.Length, sMetin2);
%>
<%=sMetin%>
</BODY>
</HTML>

Insert - VB.NET <%@Page Language="VB" Debug = "True"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Dim sMetin As String = "bir sabah, alıp seni benden gitti bu diyardan"
Dim sMetin2 As String = ", hazin bir mektup, bir-yâdigâr kalan"
sMetin = sMetin.Insert(sMetin.Length, sMetin2)
%>
<%=sMetin%>
</BODY>
</HTML>


Remove: Bu fonksiyonumuz ise bir String'in içerisindeki harf yada harfleri silmeye yarar. İki parametre alır birincisi kaç numaralı harfden itibaren silinmeye başlanacağını, ikincisi ise kaç harf silineceğini gösterir. Fonksiyonumuz Insert fonksiyonunda olduğu gibi geriye String dödürür.

Remove - C# <%@Page Language ="C#" Debug = "True"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
string sMetin = "bir sabah, alıp seni benden gitti bu diyardan";
sMetin += ", hazin bir mektup, bir-yâdigâr kalan";
sMetin = sMetin.Remove(45, 37);
%>
<%=sMetin%>
</BODY>
</HTML>

Remove - VB.NET <%@Page Language="VB" Debug = "True"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Dim sMetin As String = "bir sabah, alıp seni benden gitti bu diyardan"
sMetin += ", hazin bir mektup, bir-yâdigâr kalan"
sMetin = sMetin.Remove(45, 37)
%>
<%=sMetin%>
</BODY>
</HTML>



Replace: Bu fonksiyonumuz bir metnin içerisinde aratacağınız bir harf yada kelimeyi yine sizin belirleyeceğiniz başka bir harf yada kelime ile değiştirir. İki parametresi vardır birincisi aranacak String'i, ikincisi ise yerine konacak olan String'i temsil eder. Yine geriye String dödüren bir fonksiyondur.

Replace - C# <%@ Page Language="C#" Debug="True" %>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
string sMetin = "bir akşam, alıp seni benden gitti bu diyardan";
sMetin = sMetin.Replace("akşam", "sabah");
%>
<%=sMetin%>
</BODY>
</HTML>

Replace - VB.NET <%@ Page Language="VB" Debug="True" %>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Dim sMetin As String = "bir akşam, alıp seni benden gitti bu diyardan"
sMetin = sMetin.Replace("akşam", "sabah")
%>
<%=sMetin%>
</BODY>
</HTML>


Substring: Bu fonksiyonumuz bir String'in içerisinde ki başlangıç noktasını ve uzunluğunu belirtmiş olduğunuz konumdaki metni size verir. İki parametresi vardır. Birincisi String'in içinden okunmak istenen metnin başlangıç noktasını, ikinci parametre ise kaç karakter boyunca daha okunacağını belirtir. İkinci parametreyi yazmak zorunda değilsiniz, eğer yazmazsanız belirttiğiniz noktadan String'in sonuna kadar olan kısım tamamen okunur. Geriye String döndürür.

Substring - C# <%@ Page Language="C#" Debug="True" %>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
string sMetin = "bir sabah, alıp seni benden gitti bu diyardan";
string sTespit;
sTespit = sMetin.Substring(10, 24);
%>
<%=sTespit%>
</BODY>
</HTML>

Substring - VB.NET <%@ Page Language="VB" Debug="True" %>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Dim sMetin As String = "bir sabah, alıp seni benden gitti bu diyardan"
Dim sTespit As String = sMetin.Substring(10, 24)
%>
<%=sTespit%>
</BODY>
</HTML>


ToLower: Bu sınıfımız String'in içeriğinin tamamını küçük harfe çevirir. Fonksiyonumuzun yine String döndüren bir fonkiyondur. Sadece tek parametre alır bu parametre metnin hangi "Kültüre" ait olduğunu belirtir. Örneğin ingilizceyi düşünecek olursanız 'I' harfinin küçüğü 'i' harfidir ama türkçede bu 'ı' olarak geçer, bu parametrenin var oluş sebebi bu tür karmaşaları ortadan kaldırmakdır. Parametreyi vermek zorunda değilsiniz, bu durumda var olan "Kültür" taban alınır, ama vermek istiyorsanız bu durumda bir CultureInfo sınıfı oluşturmalısınız, Bu sınıfın "System.Globalization" NameSpace'inin içinde bulunduğunuda hatırlatalım. Elinde .NET SDK'sını bulunduranlar "CultureInfo class, about CultureInfo class" bölümünden tam listeye ulaşabilir, haricinde aşağıdaki örnek kod derlenmek suretiylede tam liste görüntülenebilir.

CultureInfo tam liste - C# <%@ Page Language="C#" Debug="True" %>
<%@ Import NameSpace = "System.Globalization"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
foreach(CultureInfo CI in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
Response.Write(CI + "<BR>");
}
%>
</BODY>
</HTML>

CultureInfo tam liste - VB.NET <%@ Page Language="VB" Debug="True" %>
<%@ Import NameSpace = "System.Globalization"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Dim CI As CultureInfo
For Each CI in CultureInfo.GetCultures(CultureTypes.AllCultures)
Response.Write(CI.ToString() & "<BR>")
Next
%>
</BODY>
</HTML>


ToLower - C# <%@ Page Language="C#" Debug="True"%>
<%@ Import NameSpace = "System.Globalization"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
CultureInfo CI = new CultureInfo("TR-TR");
string sMetin = "BİR SABAH, ALIP SENİ BENDEN GİTTİ BU DİYARDAN";
sMetin = sMetin.ToLower(CI);
Response.Write("CultureInfo TR-TR= "+sMetin+"<BR>");


CultureInfo CI2 = new CultureInfo("EN-US");
string sMetin2 = "BİR SABAH, ALIP SENİ BENDEN GİTTİ BU DİYARDAN";
sMetin2 = sMetin2.ToLower(CI2);
Response.Write("CultureInfo EN-US= "+sMetin2+"<BR>");
%>
</BODY>
</HTML>

ToLower - VB.NET <%@ Page Language="VB" Debug="True"%>
<%@ Import NameSpace = "System.Globalization"%>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Dim CI As New CultureInfo("TR-TR")
Dim sMetin As String = "BİR SABAH, ALIP SENİ BENDEN GİTTİ BU DİYARDAN"
sMetin = sMetin.ToLower(CI)
Response.Write("CultureInfo TR-TR= "& sMetin &"<BR>")


Dim CI2 As New CultureInfo("EN-US")
Dim sMetin2 As String = "BİR SABAH, ALIP SENİ BENDEN GİTTİ BU DİYARDAN"
sMetin2 = sMetin2.ToLower(CI2)
Response.Write("CultureInfo EN-US= "& sMetin2 &"<BR>")
%>
</BODY>
</HTML>


Yukarıdaki örneğimizin sonuçlarını inceleyecek olursanız CultureInfo'yu EN-US olarak belirlediğimizde 'I' harfinin 'ı' olarak değilde 'i' olarak, yanlış bir biçimde küçültüldüğünü görebilirsiniz. Burada verdiğimiz parametreye dikkat edin, parametreyi sadece EN şeklinde de geçebilirdik, ama eğer biraz önce bahsettiğimiz listeyi inceleyecek olursanız bir dilin( örneğin çince) birden farklı çeşidi olduğunu farkedeceksiniz. Bu tür bir sorunla karşılaşabileceğinizi seziyorsanız parametreyi ikili haliyle verin.

ToUpper: Bu fonksiyonumuz ise bir önceki fonksiyonumuz ile tamamiyle aynı, tek fark; String'in içindeki bütün harfleri büyük yapar.

Trim: Bu son fonksiyonumuz ise parametresiz olarak kullanıldığında String'in başındaki ve sonundaki boşluk karakterlerini (white space; 0x9, 0xA, 0xB, 0xC, 0xD, 0x20, 0xA0, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x3000, 0xFEFF) temizlemeye yarar, eğer dilerseniz bir karakter dizesini parametre olarak geçip String'in başından ve sonundan bu verdiğiniz karakterleride temizletebilirsiniz, bunun haricinde herhangi bir parametresi yok. Geriye String döndürür. Bu fonksiyonumuza ek olarak TrimStart ve TrimEnd fonksiyonlarımızında olduğunu hatırlatalım. Bu fonksiyonlarımız Trim fonksiyonumuzla aynı nitelikleri taşır, yalnızca; TrimStart metnin başındaki, TrimEnd ise sonundaki boşluk yada belirtilen karakterleri temizler.

Trim - C# <%@ Page Language="C#" Debug="True" %>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
string sMetin = " bir sabah, alıp seni benden gitti bu diyardan#";
sMetin = sMetin.Trim();
Response.Write("Boşluklar temizlendi:"+ sMetin +"<BR>");

sMetin = sMetin.Trim('#');
Response.Write("Belirlenen karakterler temizlendi:"+ sMetin +"<BR>");
%>
</BODY>
</HTML>

Trim - VB.NET <%@ Page Language="VB" Debug="True" %>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Dim sMetin As String = " bir sabah, alıp seni benden gitti bu diyardan#"
sMetin = sMetin.Trim()
Response.Write("Boşluklar temizlendi:"& sMetin &"<BR>")

sMetin = sMetin.Trim("#")
Response.Write("Belirlenen karakterler temizlendi:"& sMetin &"<BR>")
%>
</BODY>
</HTML>

Regex

Aslında Regex sınıfını anlatmamayı planlamıştım, çünkü bu sınıfı tam olarak anlayabilmeniz için başlangıç seviyesinde C# yada VB.NET ve birazcıkda nesne yönelimli programlama bilmeniz gerekir. Eğer aşağıda bahsi geçen herhangi bir terimi anlamıyorsanız o terimle ilgili bir kaynakdan ne olduğunu öğrenmeyi deneyin ve bu noktadan sonra sadece gerektiğinde örnek vereceğiz ve yine unutmadan Regex sınıfının aşağıdakilerden hariç üyeleri ve metodları olduğunu unutmayın.


Regex
CompileToAssembly
IsMatch
Match
Matches
Replace

Regex: Bu Regex sınıfının Constructor'ı, 3 farklı şekilde Overload edilmiş, Bu şekilleri size liste halinde ve aldıkları parametreler ile beraber aşağıda verdim.

Regex()
Bu metod protected olanı.

Regex(string pattern)
Burada pattern Regular Expression Pattern/Düzenli İfade Deseni 'ni temsil ediyor.

Regex(string pattern, RegexOptions options)
pattern yine deseni temsilen burda, options ise verebileceğiniz olası RegexOptions enumeration/liste 'sinin Bitwise OR birleşimlerini almak amacıyla burada.

Şimdi size biraz RegexOptions'dan bahsedelim. Bu, söylediğim gibi bir enumeration, Regex sınıfı ile yapacağınız aramaların özelliklerini belirleyebilmeniz için. Aşağıda tam liste ve bayrakların(flag) ne işe yaradığını veriyorum.

RegexOptions - tam liste Compiled İfade bir assembly'ye derlenmişdir. Geç açılır-hızlı çalışır.
ECMAScript Bu, ifadeniz için, ECMAScript uyumlu bir davranış sergilenmesini sağlar. Sadece, IgnoreCase, Multiline ve Compiled bayraklarının birleşimi ile birlikte kullanılabilir.
ExplicitCapture Bu, desenin içerisinde yakalanacak bölümlerin açıkça, (?<isim>...) formatında isimlendirildiğini yada numaralandırıldığını belirtir. İsimlendirmediğiniz parantezlerin, ifadenin sözdizimsel hantallığı; (?:...) olmaksızın, yakalanmayan gruplar olarak davranmalarını sağlar.
IgnoreCase Arama case-insensitive yani büyük küçük harf duyarsız yapılır.
IgnorePatternWhitespace Desendeki boşluk karakterlerini (white space, yukarıda listesi var) yok farzeder ve # ile başlayan yorum satırları koyabilmenizi sağlar.
Multiline ^ ve $ karakterlerinin anlamlarını, sırasıyla, bir satırın, başlangıcı ve bitişi olarak değiştirir.
None Hiçbir özelliğin kullanılmasına gerek olmadığını belirtir.
RightToLeft Aramanın soldan-sağa değilde, sağdan-sola yapılmasını sağlar.
Singleline Singleline modunu açar. Nokta karakterinin anlamını değiştirir, böylelikle nokta, '\n' hariç herhangi bir karakteri temsil edebililen bir 'joker' durumuna gelir.

Bundan sonra size vereceğimiz Overload listelerinde baş tarafında S yazanlar static olanlar(Visual Basic'de Shared olarak geçiyor). Küçük işleri halledebilmek için bir Regex nesnesi oluşturulmasına gerek kalmaması amacıyla izole edilmişler.

CompileToAssembly: Bu bir yada daha fazla düzenli ifade desenini sabit diske tek bir assemly olarak kaydetmenizi sağlar.

S CompileToAssembly(RegexCompilationInfo[] regexinfos, AssemblyName assemblyname)
regexinfos, derlenecek olan düzenli ifadeleri tanımlamak amacıyla burada olan, bir RegexCompilationInfo[] dizesi(array), assemblyname ile ise, assembly' nizi tanımlayabilirsiniz.

S CompileToAssembly(RegexCompilationInfo[] regexinfos, AssemblyName assemblyname, CustomAttributeBuilder[] attributes)
Bir öncekinden farklı olan attributes ise, derlenecek olan assembly'nin özelliklerini tanımlamak amacıyla burada olan, bir CustomAttributeBuilder[] dizesi.

S CompileToAssembly(RegexCompilationInfo[] regexinfos, AssemblyName assemblyname, CustomAttributeBuilder[] attributes, string resourceFile)
son olarak resourceFile ile ise, assembly'ye eklenecek olan Win32 kaynak dosyalarını belirleyebilirsiniz.

IsMatch: Bu metodumuz belirteceğimiz bir metnin içerisinde aradığımız bir kelimenin olup olmadığını kontrol eder, eğer varsa, geriye dönen true literal'ıdır, değilse, false.

IsMatch(string input)
Regex Constructor'ında belirtilen deseni verilen parametrede(input) arar.

IsMatch(string input, int startat)
Bu ise bir önceki metod ile aynı işi yapar ama startat parametresinde verilen noktadan itibaren aramaya başlar.

S IsMatch(string input, string pattern)
pattern parametresiyle verilen deseni input parametresinde verilen string'in içinde arar.

S IsMatch(string input, string pattern, RegexOptions options)
Bir önceki ile aynı işi yapar ama options parametresiylede RegexOptions listesinden oluşturacağınız bir Bitwise OR birleşiminide alabilir.

Match: Bu metodumuzda yine belirteceğimiz bir metnin içerisinde aradığımız bir kelimenin olup olmadığını kontrol eder, eğer varsa, geriye dönen true yada false literal'ı değildir; Match nesnesidir. Size küçük bir hatırlatma yapayım Match sınıfının public Constructor'ı yok. Bu da demek oluyor ki bu, Match nesnesini oluşturabilmenin tek yolu. Bu metodun 5 ayrı Overload edilmiş şekli var, bunlardan 4'ü IsMatch metodunununkiler ile aynı, tek farkları yine söylediğim gibi geriye Match nesnesi döndürüyor oldukları. Haricinde kalan fonksiyon ise aşağıda.

Match(string input, int beginning, int length)
Regex Constructor'ında belirtilen deseni verilen input parametresinde arar. beginning parametresinde verilen noktadan itibaren aramaya başlar ve bu noktadan itibaren aramasına, length parametresindeki verilen değerdeki karakter kadar devam eder.

Matches: Bu metodumuz aynı şekilde yine belirteceğimiz bir metnin içerisinde aradığımız bir kelimenin olup olmadığını kontrol eder, Match metodu sadece tek bir sonuç döndürür ama bu, bütün sonuçları döndürür. Bu metodun Overload şekilleri yine IsMatch metodundakilerle aynı, yine tek bir farkı var oda geriye MatchCollection nesnesi döndürüyor olduğu, yine aynı şekilde MatchColleciton sınıfınında Match sınıfı gibi public Constructor'ı yok.

Replace: Bu metodumuz ise belirtilen bir string'in içerisinde, belirtilen bir deseni, belirtilen bir string ile değiştirir. Tam 10 ayrı Overload şekli var, tamamı geriye string döndürüyor ve yine tamamı aşağıdaki listede mevcut ama listeye geçmeden önce yine size bahsetmek istediğim bir konu olan MatchEvaluator var. MatchEvalutor bir delegate'dir. Delegate kelimesini türkçeye 'havale etmek' olarak çevirebiliriz. delegate konusuna girmeyeceğim, çünkü çok uzun bir konu, ama tek düze bir anlatım yapmak gerekirse delegate , bir metodu çağırabilen sınıflar diyebiliriz, -C++ bilenler için konuşuyorum- bir çeşit "pointer to function", daha doğrusu "object to function". Dönelim MatchEvaluator'a, bu, parametresini "Match match" şeklinde alan ve geriye string döndüren hali-hazırda bir delegate, Replace metodumuzun bazı Overload şekillerinde bu atayabileceğiniz bir parametre olarak var. Bunu, değiştirme esnasında, içinde arama yapılan string'de, belirttiğimiz deseneye uyan kelimeye göre, "yerine konacak string'i" üretmek için kullanabilirsiniz. Delegate'in, değiştirme esnasında her yeni bulunan kelime için tekrar çağrıldığını belirtelim ve delegate konusunu kapatalım. Aşağıdaki parametrelerin anlamları şu şekildedir.

int count: Kaç taneye kadar değişim yapılabileceğini belirtir.
int startat: Kaçıncı karakterden aramaya başlanacağını belirtir.
string input: İçinde arama yapılacak metin yada string
string pattern: Desen
string replacement: Bulunanın yerine konulacak olan
RegexOptions options: RegexOption listesinden olası Bitwise OR birleşimleri
MatchEvaluator evaluator: MatchEvaluator ile çağırmak istediğiniz metodun adı

Son olarak, eğer parametreler arasında pattern yoksa Regex Constructor'ında belirtilmiş olan desen geçerlidir.

Replace(string input, MatchEvaluator evaluator)

Replace(string input, string replacement)

Replace(string input, MatchEvaluator evaluator, int count)

Replace(string input, string replacement, int count)

S Replace(string input, string pattern, MatchEvaluator evaluator)

S Replace(string input, string pattern, string replacement)

Replace(string input, MatchEvaluator evaluator, int count, int startat)

Replace(string input, string replacement, int count, int startat)

S Replace(string input, string pattern, MatchEvaluator evaluator, RegexOptions options)

S Replace(string input, string pattern, string replacement, RegexOptions options)



Regex Derlemek - C# <%@ Page Language="C#" Debug="True"%>
<%@ Import NameSpace = "System.Reflection"%>
<%@ Import NameSpace = "System.Reflection.Emit"%>

<HTML>
<HEAD>
<Title>Regex Sınıfı derlemek</Title>
</HEAD>
<BODY>
<%
string sDesen = @"\[url=(?<url>(.*?))](?<text>(.*?))\[/url\]";
string sAd = "URL";
string sNamespace = "FlashCode";
bool bIsVisible = true;

string sDesen2 = @"\[email=(?<email>(.*?))\](?<text>(.*?))\[/email\]";
string sAd2 = "EMAIL";
bool bIsVisible2 = true;

AssemblyName asmName = new AssemblyName();
//Dll mize bir ad verelim
asmName.Name = "FC Converter";
//Şimdide versiyon numarasını belirleyelim.
asmName.Version = new Version("1.0.0.1000");

RegexCompilationInfo[] rci = new RegexCompilationInfo[2];
rci[0] = new RegexCompilationInfo(
sDesen,//Derlenecek Desenimiz
RegexOptions.IgnoreCase,//RegexOptions kombinasyonumuz
sAd,//Derlenen desenin sınıfına verdiğimiz ad
sNamespace,//içinde bulunacağı namespace
bIsVisible//bu da erişilebilirlik derecesi
);

rci[1] = new RegexCompilationInfo(
sDesen2,
RegexOptions.IgnoreCase,
sAd2,
sNamespace,
bIsVisible2
);

Regex.CompileToAssembly(rci, asmName);
//Bir üst satırın işleme girmesi ile beraber
//Windows/System32 dizininde FC Converter.dll
//isimli bir dosya oluşmuş olması gerekir.
%>
</BODY>
</HTML>

Regex Derlemek - VB.NET <%@ Page Language="VB" Debug="True"%>
<%@ Import NameSpace = "System.Reflection"%>
<%@ Import NameSpace = "System.Reflection.Emit"%>
<HTML>
<HEAD>
<Title>Regex Sınıfı derlemek</Title>
</HEAD>
<BODY>
<%
Dim sDesen As String = "\[url=(?<url>(.*?))](?<text>(.*?))\[/url\]"
Dim sAd As String = "URL"
Dim sNamespace As String = "FlashCode"
Dim bIsVisible As Boolean = True

Dim sDesen2 As String = "\[email=(?<email>(.*?))\](?<text>(.*?))\[/email\]"
Dim sAd2 As String = "EMAIL"
Dim bIsVisible2 As String = True

Dim asmName As New AssemblyName()
'Dll mize bir ad verelim
asmName.Name = "FC Converter"
'Şimdide versiyon numarasını belirleyelim.
asmName.Version = New System.Version("1.0.0.1000")
Dim rci(1) As RegexCompilationInfo
rci(0) = New RegexCompilationInfo( _
sDesen, _
RegexOptions.IgnoreCase, _
sAd, _
sNamespace, _
bIsVisible)
'Parametrelerin anlamları için C# örneğine bakın
rci(1) = New RegexCompilationInfo( _
sDesen2, _
RegexOptions.IgnoreCase, _
sAd2, _
sNamespace, _
bIsVisible2)
Regex.CompileToAssembly(rci, asmName)
'Bir üst satırın işleme girmesi ile beraber
'Windows/System32 dizininde FC Converter.dll
'isimli bir dosya oluşmuş olması gerekir.
%>
</BODY>
</HTML>


Yukarıdaki örneğimizde bir Regex sınıfının nasıl derleneceğini görüyorsunuz. Bu örneğimizi çalıştırırsanız 'Windows/System32' dizininizde "FC Converter.dll" isimli bir dosya oluşur. bu dosya "FlashCode" isimli bir namespace ve bu namespace'in içinde "EMAIL" ve "URL" adlı iki tane derlenmiş Regex sınıfı vardır. Şimdi bu derlediğiniz regex sınıfını nasıl kullanabilirsiniz bir de buna göz atalım.

Derlenen Regex'i çağırmak - C# <%@ Page Language="C#" Debug="True"%>
<%@ Assembly Name = "FC Converter"%>
<%@ Import NameSpace = "FlashCode"%>
<HTML>
<HEAD>
<Title>Derlenmiş Regex sınıfını çağırmak</Title>
</HEAD>
<BODY>
<%
string sMesaj = "";
URL ur = new URL();
sMesaj = ur.Replace(sMesaj,"<a href=${url}>${text}</a>");
Response.Write(sMesaj);
%>
</BODY>
</HTML>

Derlenen Regex'i çağırmak - VB.NET <%@ Page Language="VB" Debug="True"%>
<%@ Assembly Name = "FC Converter"%>
<%@ Import NameSpace = "FlashCode"%>
<HTML>
<HEAD>
<Title>Derlenmiş Regex sınıfını çağırmak</Title>
</HEAD>
<BODY>
<%
Dim sMesaj As String = ""
Dim ur As New URL()
sMesaj = ur.Replace(sMesaj,"<a href=${url}>${text}</a>")
Response.Write(sMesaj)
%>
</BODY>
</HTML>


Server'ınızın kök dizinine (muhtemelen "c:\inetpub\wwwroot" dizini) "Bin" isimli bir dizin oluşrurursanız ve assembly'nizi bunun içine koyarsanız bu durumda assembly'niz otomatik olarak yüklenir ama eğer siz bunu başka bir dizine koyduysanız, o zaman bu assembly'yi yükleyebilmek için yine server'ınızın kök dizinindeki "web.config" dosyasında bir kaç değişiklik yapmanız gerekir. Assembly'yi root dizininizdeki "\Text\Regex\Bin" dizinine yerleştirdiyseniz o zaman yazmanız gereken kod şu şekildedir.

<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Text\Regex\Bin"/>
</assemblyBinding>
</runtime>
</configuration>

Yukarıdaki probing tekniği, bunun haricinde birde codebase tekniği var. Eğer yukarıdaki yöntemi kullanırsanız kodlarınıza Assembly direktifini eklemelisiniz. anlayacağınız üzere probing tekniği; autoexec.bat dosyalarına yazdığımız, bir çeşit "SET PATH=C:\A_Klasörü" gibi bir ifade, eğer web.config dosyasına erişemiyorsanız, o zaman Assembly sınıfının static metodlarından biri olan LoadFrom'u CreateInstance ile beraber yada sadece Activator sınıfının static metodlarından biri olan CreateInstanceFrom 'u kullanabilirsiniz. Artık bundan sonrasını ben sizlere bırakıyorum, benim anlatacaklarım bu kadar, örnek kodları ilerletmek size kalmış. Ben yazılarda ve örneklerde acemi arkadaşları kaybetmemek için olabildiğince taban seviyede kalmaya çalıştım, yazıları ve örnekleri tam "derinlemesine" veremedik, bu yüzden anlatımlar yada örnekler asıl amacından sapmış yada eksik kalmış olabilir. -Umarım sizlere faydalı olabildik.
Alıntı ile Cevapla
Cevapla
Arama Etiketleri: , ,



Seçenekler


Benzer Konular
Konu Konu Açanlar Forum Cevaplar Güncel Mesajlar
String Fonksiyonlari B737 Visual Basic & Action script 0 24-01-2008 02:44
Visual Basic.NET'de yenilikler, değişiklikler B737 .NET programcılığı 0 24-01-2008 01:55
XOR ile String şifreleme. Celebrian Visual Basic & Action script 0 24-12-2007 11:46
String işlemleri egitimbilgisi Programlama Makaleleri 0 26-11-2007 01:29
c# String Cogaltma rhythm C, c++, c# 0 27-10-2007 02:50


Webmaster web tasarım online reviews ~ Kadınlar blogu ~ Apple iPhone, iPod Touch ( iTouch ) Forum ~ iPhone