String İşlemleri – 2
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> string sDesen2 = @"[email=(?<email>(.*?))](?<text>(.*?))[/email]"; AssemblyName asmName = new AssemblyName(); RegexCompilationInfo[] rci = new RegexCompilationInfo[2]; rci[1] = new RegexCompilationInfo( Regex.CompileToAssembly(rci, asmName); |
|
| 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 Dim asmName As |
|
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.