Makale Özeti

Metinler üzerinde desen eşleştirmesi vb. işlemler için System.Text.RegularExpressions isim uzayının kullanılması.

Makale


System.Text.RegularExpressions İsim Uzayının Kullanımı
 

Her ne kadar String sınıfı metin işlemeyle ilgili çok sayıda metod sunsa da, özellikle desenli metin tanımlama ve desen bazlı arama ve eşleştirme konusunda yetersiz kalır. Metinler üzerinde bu tarz işlemler yapmak için .NET Framework bize System.Text.RegularExpressions isim uzayını  sağlar.

Regular Expressionlar bir metin desenini tanımlamak için kullandığımız expressionlardır.

Örneğin, 

\d{5}

5 rakamdan oluşan bir posta kodunu belirtmek için kullanılan bir regular expressionken, daha zorlu bir regular expression olarak e-posta adreslerini eşleyebilen

\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

örnek verilebilir.

Bu makalede, regular expressionların nasıl tanımlanabildiğinden, ziyade, System.Text.RegularExpressions sınıfların ve metodların nasıl kullanılabildiğini göreceğiz.

Bu isim uzayının kalbi, Regex sınıfıdır. Bu sınıftan, constructorına kullanacağımız regular expressionın tanımını geçerek, bir nesne türeterek kullanabiliriz.
 


Regex eMailExp = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
 


Şimdi bu nesnenin Matches metodunu kullanarak bir metnin içindeki e-posta adreslerini arayabiliriz. Bu metod bize Regular Expression eşlemelerini tutan Match sınıfı nesnelerinden oluşan  bir koleksiyon döndürecektir.
 


MatchCollection eslenenler = eMailExp.Matches(metin);
 


Şimdi de bu koleksiyon üzerinde dolaşarak bulduğumuz e-posta adreslerini ekrana basalım.
 

      foreach(Match eslenen in eslenenler)

      {

            Console.WriteLine(eslenen.ToString());

      }


Elimizdeki metinde belirttiğimiz desene uyan parçaları bulmayı başardık. Peki ya bu eşlenen parçaların da alt parçalarını  gruplandırmak istiyor olsaydık.

Senaryomuz şöyle olsun, elimizde isimlerin yanında e-posta adreslerinin, sonra da telefon numaraları ve adreslerin yazdığı bir metin olsun. Bize de bu metinden isimler ve e-posta adresleri lazım. Bu durumda yapmamız gereken isim ve e-postaları eşleyebilecek deseni yazmak ve uyacak parçalarda da, isim ve e-posta adreslerine ayrı ayrı ulaşabilmek için oluşturacağımız regular expressionda grupları belirtmek .
 

string metin2 = "Onur onur@onura.net 09991234567 Kadikoy Istanbul Ozgur ozgur@onura.net 0 999 999 5533  Merkez Aydin Pelin pelin@onura.net Besiktas Istanbul";

Regex adEPosta = new Regex(@"(?<isim>(\w+)\s)" +

// <isim> diyerek regular expressionımızın bu kısmını isim olarak gruplandırmak istediğimizi belirttik

                  @"(?<ePosta>\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)"  ) ;

// ?<ePosta> diyerek de expressionın bu kısmını ePosta olarak gruplandırmak istediğimizi belirttik

 


Desenimize uyan parçaları önceki gibi alıyoruz ve koleksiyonu dolaşıyoruz.

Fakat bu sefer eşleyen her Match nesnesi için Groups koleksiyonunu kullanarak az önce  belirttiğimiz isim ve e-posta parçalarına ayrı ayrı ulaşabileceğiz.
 

      MatchCollection eslenenler2 = adEPosta.Matches(metin2);

 

      foreach(Match eslenen2 in eslenenler2){

                 

            Console.WriteLine(eslenen2);

            Console.WriteLine("isim:{0}",eslenen2.Groups["isim"]);

            Console.WriteLine("E-Posta:{0}",eslenen2.Groups["ePosta"]);

      }

 


Bu makaleyle beraber System.Text.RegularExpressions isim uzayının sınıflarını kullanarak bir metin üzerinde zor eşleştirmelerin nasıl kolaylıkla yapılabildiğini görmüş olduk. Bundan sonra yapmamız gereken bu isim uzayını kurcalayarak inceliklerini keşfetmek.

İyi çalışmalar,

Onur Ağın
onur@onura.net

Bu makaledeki kodun birleştirilmiş hali aşağıdadır.
 

            static void Main(string[] args)

            {

 

                  // Önce üzerinde işlem yapacağımız stringi tanımlayalım

                  string metin = "Bana onur@onura.net, veya onuragin@yahoo.com adreslerinden ulasabilirsiniz.";

 

                  // şimdi de arayacağımız deseni

                  Regex eMailExp = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");

 

                  // şimdi nesnemizin Matches metodundan dönen Match nesne koleksiyonunu alalım

                  MatchCollection eslenenler = eMailExp.Matches(metin);

 

                  Console.WriteLine(metin);

                  Console.WriteLine("metninde bulunan e-posta adresleri:");

                 

                  // Şimdi de koleksiyondaki eşlenen elemanları tek tek ekrana basalım.

                  foreach(Match eslenen in eslenenler)

                  {

                 

                        Console.WriteLine(eslenen.ToString());

                 

                  }

 

 

                  // Şimde de gruplandırmaya bakalım

 

 

                  string metin2 = "Onur onur@onura.net 09991234567 Kadikoy Istanbul Ozgur ozgur@onura.net 0 999 999 5533  Merkez Aydin Pelin pelin@onura.net Besiktas Istanbul";

 

                  // isimi eşleyecek olan regular expressionla, e-posta adreslerini eşleyecek

                  // regular expressionı gruplandırarak birleştirmemiz gerekiyor

                  Regex adEPosta = new Regex(@"(?<isim>(\w+)\s)" +

          // <isim> diyerek regular expressionımızın bu kısmını isim olarak gruplandırmak istediğimizi belirttik

                                         @"(?<ePosta>\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)"  ) ;

             // ?<ePosta> diyerek de expressionın bu kısmını ePosta olarak gruplandırmak istediğimizi belirttik

                 

 

                  Console.WriteLine("----------------");

                  Console.WriteLine(metin2);

            Console.WriteLine("Şimdi bu metindeki isim ve E-postaları gruplayarak eşliyoru<:");

                 

                  MatchCollection eslenenler2 = adEPosta.Matches(metin2);

 

                  foreach(Match eslenen2 in eslenenler2){

                 

                        // Önce uyan parçanın tamamını basalım ekrana

                        Console.WriteLine(eslenen2);

                        // Şimde de Groups["isim"] diyerek expressionın

                        //isim diye böldüğümüz kısmına ulaşalım

                        Console.WriteLine("isim:{0}",eslenen2.Groups["isim"]);

                        // şimdi de e-posta kısmına

                        Console.WriteLine("E-Posta:{0}",eslenen2.Groups["ePosta"]);

                 

                  }