String İşlemleri - 2

Regular Expressions (Düzenli İfadeler) 'in ASP.NET 'teki kullanımını inceleyen bir makale

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ık da 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 yapılandırıcısı (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 burada, 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.

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, '' '' 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 ya da 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 yapılandırıcısı 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 yapılandırıcısında (constructor) 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 yapılandırıcısıı 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 yapılandırıcısı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=http://www.msn.com]MSN[/URL]";
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 = "[URL=http://www.msn.com]MSN[/URL]"
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:inetpubwwwroot" 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 "TextRegexBin" dizinine yerleştirdiyseniz o zaman yazmanız gereken kod şu şekildedir.

<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="TextRegexBin"/>
</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.

,

Arşivden

Yorum bulunmuyor.

Yorum yazabilirsiniz


* [b], [i] ve [quote] serbest