Düzenli İfadeler (Regular Expressions)

Eyl 08, 2013

Düzenli ifadeler (regular expressions) bütün modern programlama dillerinin parçasıdır. Bütün programlama dillerinde bu ifadeler aynı söz dizimine (syntax) sahiptir. Düzenli ifadeler (regular expressions) bir katarın kısa yoldan ve esnek bir biçimde belirlenmesini sağlar. Düzenli ifadeler (regular expressions) ile bu katara bir kalıp atanır ve bu kalıbın da program içindeki bu katarın bütün eşlenik ifadelerine geri dönmesi sağlanır. Böylece program içinde arama yapma veya yer değiştirme gibi olaylar kolayca yerine getirilebilir. Bunu yerine getirmek için bazi özel karakterler kullanılır. Bu özel karakterler ve anlamları şu şekilde sıralanabilir:

  1. Meta Karakterler

    • "." : Herhangi bir tek karakter ile eşleştirilebilir. Örnek olarak "d.neme" ifadesi "deneme", "daneme", "doneme" gibi katarlarla eşlenir.

    • "$" : Eşlendigi ifadenin sonunu belirtir. Örnek olarak "deneme$" ifadesi "bu örnek bir deneme" gibi ifadelere eşlenir. Görüleceği üzere "deneme" ifadesinden sonra katar sonlanmıştır.

    • "^" : "$" ifadesine ters olarak eşlendigi ifadenin baslangıcını belirtir. Örnek olarak "^nerede" ifadesi "nerede bu insanlar" gibi ifadelere eşlenir.

    • "*" : Bir ifadenin bütün tekrarlanmalarına eşlenir. Örnek olarak ".*" ifadesi bütün karakterlere eşlenir.

    • "[ ]" : Köseli parantezler içine girilen bütün karakterlerle eşlenir. Örnek olarak "d[ea]neme" ifadesi "deneme" veya "daneme" ile eşlenir. Baska hiçbir ifade ile eşlenmez.

    • "[c1-c2]" : Tire işareti ile bir aralık belirlenir ve bu aralığa göre eşleme yapilir. Ayrıca bu aralık için birleşik ifadeler de yazılabilir. Örnek olarak "[0-9]" ifadesi bütün rakamlar ile eşlenir. Birleşik ifadeye örnek olarak "[A-Za-z]" ifadesi de bütün harflerle büyük küçük ayrımı yapmadan eşlenir.

    • "[^c1-c2]” : Belirtilen aralık harici bütün karakterlere eşlenir. Örnek olarak "[^123a-z]" ifadesi 1, 2, 3 sayıları ve bütün küçük harfler dışında bütün ifadelere eşlenir.

    • "<>" : Bu ifade 3 değişik şekilde kullanılabilir. "<" ifadesi bir kelimenin başına, ">" ifadesi bir kelimenin sonuna, "<>" ifadesi ise direkt olarak bir kelimeye eşlenir.

    • "( )" : İfadeyi gruplandırmaya yarar. Ayrica gruplandırılmış ifadelerine denk gelen kalıpları saklar ve en fazla 9 kalıp saklayabilir.

    • "|" : Veya anlamındadır. İki ifadeye de ayrı ayrı eşlenebilir. Örnek olarak "(kim|ne)" ifadesi, "suradaki kim" ve "elindeki ne" ifadelerine eşlenir.

    • "+" : Kendinden önce gelen ifadenin veya karakterin bir veya daha fazla kullanımına eşlenir. Örnek olarak "9+" ifadesi 9 ile, 99 ile, 999 ile,... eşlenir.

    • "?" : Kendinden önce gelen karakterin 0 veya 1 tekrarina eşlenir.

    • "{ }" : Belirlenilmiş sayıda tekrar anlamındadır. Örnek olarak "A[0-9]{3}" ifadesi A harfi ile başlayıp yanında 3 tane rakam olan ifadeye eşlenir. Yani A123 veya A289 gibi.

    • "{i,j}" : Belirlenmiş sayıda tekrar anlamındadır tek farkı "i" ile "j" aralığındaki bütün tekrarlara eşlenir. Örnek olarak "[0-9]{4,6}" ifadesi bütün 4, 5 veya 6 elemanlı sayı dizilerine eşlenir.
  2. Yer Değiştirme Karakterleri

    • "$number" : Ondalık bir numaraya sahip olan grupla eşleşmiş son alt katarın yerine geçer.

    • "${name}" : Bir grupla eşleşmiş son alt katarın yerine geçer.

    • "$$" : Bir "$" işaretinin yerine geçer.

    • "$&" : Bütün bir eş kopyasının yerine geçer.

    • "$`" : Bütün bir katar girdisinin yerine eşleşmeden önce geçer.

    • "$'" : Bütün bir katar girdisinin yerine eşleşmeden sonra geçer.

    • "$+" : Tutulmuş son grubun yerine geçer.

    • "$_" : Bütün bir katar girdisinin yerine geçer.
  3. Karakter Sınıfları

    • “\p{isim}”: Her türlü “Unicode” kategorideki isimle eşleşir. Örnek olarak, "Ll, Lu, Nd, Z, IsGreek" gibi “Unicode” isimlerle eşleşir.

    • “\P{isim}”: Her türlü “Unicode” kategoride olmayan isimle eşleşir.

    • “\w” : Bütün sözcüklerle eşleşir. Örnek olarak şu “Unicode” kategoriye denktir: “[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]“ veya “Unicode” kategoride olmayan şu karakterlere de denk gelir: “[a-zA-Z_0-9]”.

    • “\W”: Sözcük olmayan bütün karakterlerle eşleşir.  Şu “Unicode” kategoriye denk gelir: “[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]”, ayrıca şu ifadeye de denktir: “[^a-zA-Z_0-9]”.

    • “\d” : Bütün ondalık sayılara eşlenir. “Unicode” kategoride şuna denktir: “\p{Nd}”.  Ayrıca “[0-9]” ifadesine de denk gelir.

Yukarıda anlatılan özel karakterlerin katara atanması için "@" işareti kullanılır. .Net içinde düzenli ifadeleri kullanabilmek için “System.Text.RegularExpressions” isim uzayı kullanılır. Bu isim uzayı içinde "Regex” sınıfı yardımıyla nesne üretilir. “Regex” sınıfının 7 ayrı metodu vardır. Bunlar:

  • Escape: Meta karakterleri katar içinden çıkarır.

  • Unescape: “Escape” metoduyla katardan çıkarılmış karakterleri tekrar katar içine alır.

  • IsMatch: Düzenli ifadenin (regular expression) bir katarla eşleşip eşleşmediğini doğru ya da yanlış olarak (boolean) döner.

  • Match: Eşleşmiş düzenli ifadeyi (regular expressions) döner.

  • Matches: Eşleşmiş düzenli ifadeleri (regular expressions) bir liste şeklinde döner.

  • Replace: Eşleşmiş düzenli ifadeleri (regular expressions) eşleştiği katarla yer değiştirir.

  • Split: Düzenli ifadeler (regular expressions) ile tanımlanmış katarların dizisini döner.

Düzenli ifadeler (regular expressions) genellikle bir metin içinden e-posta adresi, telefon numarası veya tarih gibi ifadeleri çekmek için kullanılır. Bütün bu ifadelerin düzenli ifadeler (regular expressions) içindeki desenlerinin basit birer örneği aşağıda verilmiştir:

  • E-posta deseni: "^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"

  • Telefon numarası deseni: "0\([0-9]{3}\)-[0-9]{3}-[0-9]{2}-[0-9]{2}"

  • Tarih deseni: "^\d{1,2}\/\d{1,2}\/\d{4}$"   

Aşağıda da telefon deseninin örnek uygulaması verilmiştir:

  • Burada aşağıda tanımlanacak olan "Bul" fonksiyonu çağırılarak girilecek olan metin içindeki telefon numaralarının ekrana yazdırılması sağlanmıştır: 

    static void Main(string[] args
    {

            Console.WriteLine("içinde telefon numaraları 
            olan(0(XXX)-XXX-XX-XX formatında) bir metin 
            giriniz:");
            string metin = Console.ReadLine();
            foreach (string item in Bul(metin))
                Console.WriteLine("{0}", item);
     }

  • " Bul" fonksiyonu aşağıdaki gibi tanımlanarak metin içindeki telefon numaraları ana fonksiyona gönderilmektedir: 

    protected static List<String> Bul(string metin)
    {
           string RegExId = @"0\([0-9]{3}\)-[0-9]{3}-[0-9]
           {2}-[0-9]{2}";
           List<String> Bulunanlar = new List<String>();
           Regex telefonNo = new Regex(RegExId);
           MatchCollection tlfMatchCollection = 
           telefonNo.Matches(metin);
           foreach (Match item in tlfMatchCollection)
               Bulunanlar.Add(item.ToString());
           return Bulunanlar;
    }

  • Aşağıda da bu uygulamanın ekran çıktısı görülmektedir: