Düzenli İfadeler (Regular Expressions)

Düzenli İfadeler

Bilindiği üzere düzenli ifadeler, genelde metinsel ifadelerin, bir desene göre kontrol edilmesini ve düzenlenmesini sağlar. Amerikalı matematikçi Stephen Cole Kleene tarafından 1950’li yıllarda tasarlanan bu kavram günümüzde oldukça yaygın olarak birçok işletim sistemi temelinde ve programlama dilinde entegre olarak gelmektedir.
Kimlik numaralarının kontrolünde, e-posta, telefon no kontrolünde, parola kontrolünde hatta kredi kartı vb. kontrolünde kullanılabilir.
RegEX
Genel olarak kullanım amacını sayarsak :

  • Kullanıcı tarafından girilen girdinin denetimi,
  • Verilerin uygun formata göre düzenlenmesi,
  • Veritabanından formata uyan verinin çekilmesi şeklinde sıralayabiliriz.

Bir web uygulaması düşünelim. Kullanıcı arayüzünde bir form bulunmakta ve bu formda kullanıcı bilgilerinin girileceği input alanlar yer almakta. Bu alanlardan e-posta girişinin zorunlu olduğunu farzedelim. Geliştirme yaptığınız çatının (framework) doğrulama(validasyon) yöntemleri ile bu işi kolaylıkla yapabilirsiniz. Ama uygulamanız masaüstü bir uygulama ise düzenli ifadeler fazlasıyla yardımcınız olacaktır. Düzenli ifadelerin ilk aşaması bir desen (pattern) oluşturmaktır. Desen tanımlanır ve metinsel ifadeler bu desen bazında denetlenirler. Desen oluştururken dikkat etmemiz gereken karakter tanımlamaları vardır.
Bunlara kısaca değinirsek:

  • ^ parametresi: Satır başından- başlayan anlamına gelmektedir.
    Örnek kullanım :
           // “ça” ile başlayan kelimeler
           Regex desen =new Regex( @"^ça");
    
            string[] ifadeler = new string[] { "çankırı", "cankırı", "bursa" };
            foreach (var ifade in ifadeler)
            {
                if (desen.IsMatch(ifade))
                    Console.WriteLine(ifade);
            }  
    

    Çıktı : “çankırı”

  • $ parametresi: satır sonu anlamına gelir.

Örnek Kullanım :

            // "ef" ile biten kelimeleri yaz
            Regex desen =new Regex( @"ef$");

            string[] ifadeler = new string[] { "hedef", "cankırı", "bursa","f","efe","ef" };
            foreach (var ifade in ifadeler)
            {
                if (desen.IsMatch(ifade))
                    Console.WriteLine(ifade);
            }

Çıktı :
hedef
ef

  • ”+” Parametresi :Kendinden önce gelen karakterin en az 1 defa ya da daha fazla kullanılacağını belirtir.

Örnek Kullanım:

           // "ı" karakterini  en az 1 defa ya da daha fazla tekrar et.
            Regex desen =new Regex( @"çankı+rı");

            string[] ifadeler = new string[] { "çankırı", "çankrı", "çankıııııırııı","çankııırı" };
            foreach (var ifade in ifadeler)
            {
                if (desen.IsMatch(ifade))
                    Console.WriteLine(ifade);
      } 

Çıktı :
çankırı
çankıııııırııı
çankııırı

  • * parametresi : kendinden öncekik karakterin olmaması ya da birden fazla olması durumunda kullanılır.

Örnek Kullanım:

            // "*" karakteri
            Regex desen =new Regex( @"çankı*rı");

            string[] ifadeler = new string[] { "çankırı", "çankrı", "çankıııııırııı","çankııırı" };
            foreach (var ifade in ifadeler)
            {
                if (desen.IsMatch(ifade))
                    Console.WriteLine(ifade);
      }

Çıktı : dizinin tüm elemanları

  • \d parametresi : Rakamsal ifadeleri denetlemek için kullanılır.

Örnek kullanım:

            // "\d" karakteri. Veri yalnızca rakamlardan oluşsun
            Regex desen =new Regex( @"^\d*$");

            string [] ifadeler = new string[] { "123444", "çankrı", "1234a12" };
            foreach (var ifade in ifadeler)
            {
                if (desen.IsMatch(ifade))
                    Console.WriteLine(ifade);
      }

Çıktı: 123444

  • \w parametresi: Alfanumerik karakterlerin varlığını denetler. Girilen veride rakam ve harf varsa true döner.

Örnek Kullanım :

            // "\w" alfanumerik .
            Regex desen =new Regex( @"^\w*$");

            string [] ifadeler = new string[] { "123444", "çankırı", "1234a12-" };
            foreach (var ifade in ifadeler)
            {
                if (desen.IsMatch(ifade))
                    Console.WriteLine(ifade);
            }

Çıktı : 123444 Çankırı

  • {} tekrar sayısı parametresi : kendinden önceki gelen karakterin belirtilen miktarda tekrar edilmesini sağlar.

Örnek kullanım :

            // "{}" tekrar sayısı parametresi. "k" karakteri 3 defa yazılacak
            Regex desen =new Regex( @"^çank{3}ırı"); 

            string [] ifadeler = new string[] { "çankkkırı", "çankırı", "çankkırı" };
            foreach (var ifade in ifadeler)
            {
                if (desen.IsMatch(ifade))
                    Console.WriteLine(ifade);
      }

Çıktı : çankkkırı

  • [] dizi parametresi: Girilen veride sadece [] ifadesi içerisinde belirtilen karakterlerin kullanılmasını sağlar.

Örnek kullanım :

            // "[]" dizi parametresi. Metin ve çetin isimli kişileri bul
            Regex desen =new Regex( @"^[mç]etin$"); 

            string [] ifadeler = new string[] { "metin", "metiner", "çetin","etin","çetiner" };
            foreach (var ifade in ifadeler)
            {
                if (desen.IsMatch(ifade))
                    Console.WriteLine(ifade);
      } 

Çıktı :
metin
çetin

Genel Örnekler:

Sadece harf :“^[a-zA-Z]*$” . Türkçe karakterler bu desene uymaz. Türkçe karakter denetimi yapacaksak^[a-zA-ZiİçÇşŞğĞÜüÖö]*$ örnek deseni kullanılabilir.

Sadece rakam : “^[0-9]*$” deseni kullanılabilir.

Telefon numarası : 5xx-xxx-xx-xx gsm numarası için “5[0-9]{2}-[0-9]{3}-[0-9]{2}-[0-9]{2}”

              // "Telefon no örneği"
            Regex desen =new Regex(@"^5[0-9]{2}-[0-9]{3}-[0-9]{2}-[0-9]{2}$");

            Console.WriteLine("Telefon no giriniz. 5xx-xxx-xx-xx");
            string telefonNo = Console.ReadLine();
            if (!desen.IsMatch(telefonNo))
                Console.WriteLine("lütfen numarayı uygun giriniz");

Yukarıdaki örnekte, desenimizin başına ya da sonuna herhangi bir karakter gelmesini istemediğimiz için, başına ^ sonuna ise $ karakterini koyduk.

Örnek Uygulama :

Bilgi Güvenliği Politikasına uygun kullanıcı parolası oluşturma

  • En az 1 Büyük harf, en az 1 küçük harf, en az 1 karakter, en az 1 rakam
              // "Parola Kontrol"
              Regex upperCase = new Regex(@"[A-ZŞÇĞÜİÖ]");
              Regex lowerCase = new Regex(@"[a-zşçüğöı]");
              Regex digit = new Regex(@"[0-9]");
              Regex character = new Regex(@"[.]|[+]|[*]|[\]|[/]|[?]|[-]");
    
              Console.WriteLine("Lütfen parolanızı oluşturunuz:");
              string password = Console.ReadLine();
              bool hasUppercase = upperCase.IsMatch(password);
              bool  hasLowercase= lowerCase.IsMatch(password);
              bool hasDigit = digit.IsMatch(password);
              bool hasCharacter = character.IsMatch(password);
              bool isPassAvailable = upperCase.IsMatch(password) && lowerCase.IsMatch(password) && digit.IsMatch(password) && character.IsMatch(password);
              if (!isPassAvailable)
                  Console.WriteLine("! lütfen parolayı kriterlere uygun girin !");
    

    Düzenli ifadeler için online test aracı kullanmak isterseniz https://regex101.com/ uygulamasını tavsiye ederiz.

Bu linke tıklayarak yazıya yıldız verebilirsiniz.

December 14, 2019 tarihinde oluşturuldu.