Regular Expressions, bir çok yerde hayat kurtaran, zaman ve kod boyutunu (yeri geldiğinde) düşüren, programlama dillerine kazandırılmış en güzel özelliklerden biridir herhalde. Şu anda okuyacağınız yazı, aşağıda kaynaklarını belirttiğim makalelerin bir nevi Türkçeleştirilmiş / uyarlanmış / değiştirilmiş halidir. Önemli değil, maksat Türkçe kaynak anlamında bir şeylerin bu topluluğa kazandırılması :)
Burada yazdığım Regular Expression Patterns (Düzenlemeli İfadeler Desenleri) ücretsiz bir şekilde indirebileceğiniz Rad Software Regular Expression Designer yardımıyla deneyebilirsiniz veya 60 günlük deneme sürümünü indirebileceğiniz Expresso programıylada yazdığınız desenleri deneyip, anlamlı ifadelere dönüştürebilirsiniz.
Regular Expression Nedir?
Çoğunuz DOS zamanında (en azından bu zamanı bilenler) veya Windows ta dosya aratırken *.doc, *.xls, *.mp3 şeklinde aratma yapmışsınızdır. Peki ne demek *.doc şeklinde dosya aratmak? Özetle, dosya adı kaç karakter veya ne olursa olsun (.) nokta dan sonraki kısmı yani uzantısı doc olan bütün dosyaları ara. Peki ???.jpg yazdığımızda ne anlama gelir? Dosya adı ne olursa olsun ama 3 karakterden oluşan ve uzantısı jpg olan tüm dosyalar. Yani, 003.jpg, ahx.jpg, vb.. . Aslında biz burada *.doc yazarak bir "Pattern (Desen)" tanımlamış oluyoruz. İşte bunun gibi desenler tanımlayarak bir yazı içinde (ve/veya dosya adı, .. seçenekler uzatılabilir) belirli bir karakter topluluğunu bulmamızı / değiştirmemizi / parçalara ayırmamızı sağlar. Herhalde basit bir anlatımla ne demek istediğimi anlamışsınızdır.
Aşağıdaki gibi bir çok sorunun cevabıdır Regular Expressions;
1- Metin içindeki yazıyı linke çevirmek nasıl olur?
2- HTML Tag içindeki yazıyı nasıl bulurum?
3- Yazıdaki kelimelerin otomatik altını çizmek nasıl yapılır?
4- Bir yazının içindeki HTML tagleri nasıl temizlerim?
Örnekler
Örnekler için kullanacağımız metin;
Windows Vista için hazır mısınız?
Windows XP tabanlı bilgisayarınızın Windows Vista çalıştırmaya hazır olduğundan emin olun. Windows Vista Yükseltme Danışmanı'nı karşıdan yükleyip çalıştırın.
Fotoğraf ve videolardan hiç olmadığı kadar keyif alın
Windows Vista'nın, resim ve ev filmlerinizi mükemmel hale getirmek, düzene koymak ve paylaşmak için kullanabileceğiniz araçlarla tek bir konuma nasıl yerleştirdiğini öğrenin.
Ücretsiz casus yazılım koruması edinin
Windows XP için Windows Defender'ı karşıdan yükleyerek, bilgisayarınızın casus yazılımlara karşı korunmasına yardımcı olun.
Windows haber ve ipuçlarını gelen kutunuza alın
Exploring Windows bülteniyle, Windows güncelleştirmelerini, ipuçlarını, nasıl yapılır makalelerini ve yenilikçi fikirleri doğrudan gelen kutunuza alın.
Yazının Kaynağı : http://www.microsoft.com/turkiye/windows/default.mspx
Örneklerde kullanılmak üzere telefon numarası : 0264 123 45 67 , (0 264) 123 45 67, 02641234567
Örneklerde kullanılmak üzere email adresi :
info@example.com,
privacy@microsoft.com
Yine aynı şekilde WİNDOWS ve Windowsunuzu veya Windowslar, WindowsXP, WindowsVista şeklindeki kelimelerle Windows'a ait kelimelerden oluşan saçma bir cümle kuralım.
CodeBehind .cs sayfasında using System.Text.RegularExpressions; satırını eklemeyi unutmayın ;)
1- Yukarıdaki metinde Windows kelimesini bulmak ve Regex Kullanımı
using System.Text.RegularExpressions;
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//Arama yapılacak kaynak paragrafimiz..
string sKaynakText = @"Windows Vista için hazır mısınız?
Windows XP tabanlı bilgisayarınızın Windows Vista..
yazı yukarıdaki paragrafın aynısı,
kodu kısaltmak icin gerisini siliyorum..";
//Bulunacak kelime icin Regex Patternimiz
string regexPatternFind = "Windows";
MatchCollection collection = Regex.Matches(sKaynakText, regexPatternFind, RegexOptions.Multiline | RegexOptions.IgnoreCase);
Console.WriteLine("Bulunan Windows Kelime sayısı : {0}", collection.Count);
Console.WriteLine("");
foreach (Match s in collection)
{
Console.WriteLine("Bulunan Kelime : " + s.Value);
Console.WriteLine("Karakter pozisyon : " + s.Index.ToString());
Console.WriteLine();
}
Console.Read();
}
}
}
Bu kodun çıktısı ise;
Bulunan Windows Kelime sayısı : 17
Bulunan Kelime : Windows
Karakter pozisyon : 0
Bulunan Kelime : Windows
Karakter pozisyon : 36
Bulunan Kelime : Windows
Karakter pozisyon : 72
Bulunan Kelime : Windows
Karakter pozisyon : 127
Bulunan Kelime : Windows
Karakter pozisyon : 254
Bulunan Kelime : Windows
Karakter pozisyon : 474
Bulunan Kelime : Windows
Karakter pozisyon : 490
Bulunan Kelime : Windows
Karakter pozisyon : 602
Bulunan Kelime : Windows
Karakter pozisyon : 662
Bulunan Kelime : Windows
Karakter pozisyon : 682
Bulunan Kelime : windows
Karakter pozisyon : 859
Bulunan Kelime : WİNDOWS
Karakter pozisyon : 1084
Bulunan Kelime : Windows
Karakter pozisyon : 1095
Bulunan Kelime : Windows
Karakter pozisyon : 1113
Bulunan Kelime : Windows
Karakter pozisyon : 1125
Bulunan Kelime : Windows
Karakter pozisyon : 1136
Bulunan Kelime : Windows
Karakter pozisyon : 1172
Yukarıda gördüğünüz koda benzer örnekleri RegEx Örnekleri sayfasından alabilirsiniz. Bu sayfayı ziyaret ederek sayfanın .aspx ve .cs dosyalarını indirebilirsiniz.
Gelelim kodu açıklamaya;
11. satırda içerisinde arama yapacağımız değişkenimizi tanımlayıp, bir değer atadık. ( " Çift tırnaktan hemen önceki @ işaretinin anlamı için tıklayınız )
string sKaynakText = @".."
17. satırda arama yapacağımız kelimeyi/deseni string türünden tanımladık
string regexPatternFind = "Windows";
19. satırda ise bize MatchCollection olarak dönecek olan Regex.Matches metodunun 3 parametre alan şeklini kullanıp, collection adındaki değişkenimize atıyoruz.
Regex.Matches() Metodu iki farklı parametre çeşidiyle kullanılan ve System.Text.RegularExpressions.MatchCollection türünde değer döndüren bir metoddur. Kullanım şekilleri ;
Regex.Matches(string IcerisindeAramaYapilacakMetin, string AramaTurunuBelirtenDesen);
veya
Regex.Matches(string IcerisindeAramaYapilacakMetin, string AramaTurunuBelirtenDesen, RegexOptions RegexIcinKullanilicakSecenekler);
Buradaki RegexOptions Enum değerleri: Compiled, ECMAScript, ExplicitCapture, IgnoreCase, IgnorePatternWhitespace, Multiline, None, RightToLeft, Singleline
Birden fazla RegexOptions metod içerisinde OR (|) bitwise operatörü yardımıyla tanımlanır. Örneğin;
MatchCollection collection = Regex.Matches(sKaynakText, regexPatternFind, RegexOptions.Multiline | RegexOptions.IgnoreCase);
Bunlardan en azından şimdilik Multiline ve IgnoreCase in açıklamalarını yapmakta fayda var;
RegexOptions.MultiLine : Arama yapılacak olan metnin birden fazla satırdan oluştuğunu ayrıca ^ ve $ karakterlerinin metnin başlangıcı ve sonu değil, satır başlangıcı ve satır sonu anlamına geldiğini ifade eder.
RegexOptions.IgnoreCase : Arama yapılacak olan metinde arama yapılırken BüYüK-KüçüK harf duyarlılığını kaldırır. Aranılan kelime "anahtar" kelimesi ise, Anahtar, ANAHTAR, ANahtar şeklindeki tüm ifadelerin bulunmasını sağlar.
Kısacası, 19. satırımızın Türkçe anlamı şudur;
Ben sKaynakText değişkenimde bulunan yazıdaki, içerisinde Windows geçen kelimeleri arıyorum ama benim metnim
birden fazla satırdan oluşuyor / birden fazla satır başı var
ve metin içerisinde arama yaparken Büyük-Küçük Harf hassasiyeti olmadan (yani WİNDOWS, windows, Wİndows, hepsi kabulümdür)
bulunacak olan değerleri collection adını verdiğim değişkene ata.
Örnekte bulunan 17 Windowsun içerisinde aslında WindowsXP, WindowsVista gibi sadece tek başına "Windows" olmayan kelimelerde bulunuyor ama bulunan değer olarak WindowsXP veya WindowsVista gibi kelimenin tamamı değil, sadece aradğımız kısmı olan "Windows" kelimesi collection değişkenimizin içerisine ekleniyor. RegEx Örnekleri sayfasında bununla ilgili daha fazla örneği inceleyebilirsiniz.
Serinin Devamı - Regular Expressions .Net - Düzenlemeli İfadeler - Bölüm 2 >>
Kaynaklar :
http://www.codeproject.com/KB/dotnet/regextutorial.aspx
http://www.regular-expressions.info
http://msdn.microsoft.com/en-us/library/ms998267.aspx