C# Regular Expression (Düzenli İfadeler)

İlgili resim

Merhaba arkadaşlar,

Bu yazımda C# programlama dilini kullanarak Regular Expression (Düzenli İfadeler) ele alacağız.

Bu yazıda bahsedilecek konular

  • Düzenli İfadelerin Oluşturulması
  • Düzenli İfadelerin Gruplanması

Regular Expression, değişken sayıdaki karakter dizilerinden oluşabilecek ancak belirli koşulları sağlayabilen ifadelerdir. Yani bir metin dosyasında geçen @ karakterlerini elde etmek istiyoruz veya elimizde mail adresi olan bir kaynak var ve bütün mail adreslerinin doğru formata olup olmadığını kontrol etmek istiyoruz. İşte tam bu noktada Regular Expression devreye giriyor. C# programlama dilinde bu tür düzenli ifadeleri temsil etmek için Regex sınıfı geliştirilmiştir. Regex sınıfı System.Text.RegularExpression isim alanında bulunmaktadır. Bir karakter dizinin oluşturulan ifadeye uyup uymadığını öğrenmek için yine aynı isim alanında bulunan Match sınıfı ile yapılır.

Düzenli İfadelerin Oluşturulması

  1. Bir düzenli ifadenin satır başında mutlaka belirtilen bir karakter ile başlanması isteniyorsa ^ karakteri kullanılır. Örneğin ^8 ifadesinin anlamı yazının mutlaka 8 karakteri ile başlamasıdır. Bu düzenli ifadeye ‘8aBcD’ uyarken ‘aBcD’ yazısı uymaz.
  2. Belirli karakter gruplarını içermesi istenen düzenli ifadeler için \ karakteri kullanılır.
    • \D ifadesi ile yazının ilgili yerinde rakam olmayan tek bir karakterin bulunması gerektiği belirtilir.
    • \d ifadesi yazının ilgili yerinde 0-9 arasında tek bir sayının olacağı belirtilir
    • \W ifadesi alfanümerik olmayan karakterin olması gerektirdiği bildiriliyor. Alfanümerik karakterler ise a-z, A-Z ve 0-9 aralıklarındaki karakterlerdir.
    • \w ifadesi yazıdaki ilgili yerde sadece alfanümerik bir karakterin olabileceği belirtilir.
    • \S ifadesi yazının ilgili yerinde sadece boşluk karakterleri (tab, space) dışında herhangi bir karakterin olabileceğini bildiriyor
    • \s ifadesi ile yazının ilgili yerinde boşluk karakterlerinden birinin olabileceğini bildiriyor.
    • Bu bilgilere göre ilk karakteri 5 ile başlayan ve ikinci karakteri herhangi bir sayı olan ve son karakterinde boşluk olmayan bir düzenli ifadeyi yazacak olursak; ^5\d\s şeklinde gösterebiliriz. Bu ifadenin tamamına filtre denilmektedir
  3. Belirtilen gruptaki karakterlerden bir ya da daha fazlasını olmasını istiyorsak + işaretini kullanılırız
    • Örneğin \w+ filtresi bir ya da daha fazla sayıda alfanümerik karakterlerinin olabileceğini bildiriyor. ‘2ASD’ yazısı buna uyarken ‘@ASD’ yazısı buna uymamaktadır. Çünkü @ karakteri bir alfanümerik değildir.
  4. Birden fazla karakter grubundan bir ya da birkaçının ilgili yerde olabileceğini belirtmek istiyorsak mantıksal veya | operatörünü kullanırız.
    • Örneğin m|n|s düzenli ifadesi ile ilgili yerde sadece m, n ya da s karakterinin olabileceğini bildiriyor. Bu ifadeyi parantez içine alıp + işareti koyarsak bu karakterlerden bir ya da birden fazlasını bulunabileceğini belirtmiş oluruz. Buna göre (m|n|s)+ düzenli ifadesi ile bunu yapabiliriz.
  5. Sabit sayıda karakterin olmasını istiyorsak {adet} şeklinde belirtmeliyiz.
    • Örneğin \d{3} – \d{5} düzenli ifadesi ile ‘123-45678′ geçerli olurken ’12-34567’ yazısı geçerli olmaz.
  6. ? karakteri kullanıldığı yerde önüne geldiği karakter en fazla bir en az sıfır defa olabileceğini bildiriyor.
    • \d{3}B?A düzenli ifadesine göre ‘548A’ ve ‘548BA’ uyarken ‘548BBA’ yazısı uymaz.
  7. ‘.’ karakteri ile ilgili yerde ‘\n’ karakteri dışında herhangi bir karakter bulunabilir.
    • Örneğin \d{3}.A düzenli ifadesine göre ‘123sA’, ‘321AA’ ve ‘9877A’ yazıları uymaktadır.
  8. \b ile bir kelimenin belirtilen karakter dizisi ile sonlanması gerektiği bildirilir.
    • Örneğin \d{3} dır\b düzenli ifadesine göre ‘521dır’, ‘dsa325dır’ yazıları uyarken ‘asd845dır8’ yazısı uymaz.
  9. \B ile bir kelimenin başında ya da sonunda olmaması gereken karakterler bildirilir
    • Örneğin \d{3} dır\B düzenli ifadesine göre ‘458dır’, ‘das987dır’ ifadeleri uymazken, ‘asd654dır8’ yazısı uyar.
  10. Köşeli parantez kullanarak bir karakter aralığı da belirtebiliriz. Örneğin ilgili yerde sadece büyük harf karakterlerinden oluşmasını istiyorsak [A-Z] şeklinde kullanmalıyız. Bu düzenli ifadeler sayılar içinde geçerlidir. Buna göre [0-9] ifadesi geçerlidir.

Bu temel ifadeler bilgisi ışığında Regex ve Match sınıflarını kullanarak elimizdeki yazıların düzenli ifadeye uyup uymadığını kontrol edebiliriz.

Regex sınıfı bir düzenli ifadeyi tutar. Regex nesnesini aşağıdaki şekilde oluşturabiliriz.

yukarıdaki Regex nesnesini oluştururken filtre parametresi aslında yine yukarıda anlatılan düzenli ifadeleri temsil etmek için kullanılır. Regex sınıfının Match() metodu ise kendisine gönderilen bir yazının düzenli ifadeye uyup uymadığını kontrol eder ve uyan sonuçları Match sınıfı türünden ger döner. Match sınıfının NextMatch() metodu ise verilen yazıdaki bulunan bir sonraki düzenli ifadeyi döner. Yazının düzenli ifadeye uyup uymadığını Match sınıfının Success özelliği ile yapılır.

Düzenli ifadelerle ilgili bir diğer sınıf ise MatchCollection sınıfıdır. Bu sınıf ile bir yazı içerisinde düzenli ifadeye uyan bütün Match nesneleri tutulur.

Yukarıda Regex sınıfının statik metodu olan Matches() metodu kullanılmıştır. Bu metodun input parametresi kontrol edilmek istenen yazı, diğer parametresi olan filtre ise düzenli ifadenin kendisidir.

Şimdi bu bilgileri kullanarak örnek üzerinde pekiştirelim. Filtre [A-Z]\d{3}(a|b)+ olacak. Bu düzenli ifadenin anlamı yazının ilk karakteri A-Z arasında olacak bu karakterden sonra 3 tane rakam sonra ya ‘a’ ya da ‘b’ karakterlerinden biri ya da birden fazla sayıda karakter grubu doğru kabul edilecek. Şimdi bu mantığa göre örneğimize başlayalım.

Yukarıdaki örnekte Match sınıfının 2 özelliği ekrana yazdırılmıştır. Bunlardan ilki düzenli ifadenin bulunduğu yer diğeri ise düzenli ifadeye uyan yazıdır.

Yukarıdaki örneği Regex ve Match sınıfını NextMatch() metodunu kullanarak yapabiliriz. Kodumuzu değiştirerek aynı sonucu alan diğer örneği yapalım.

Düzenli İfadelerin Gruplanması

Bir düzenli ifadeye uyan alt karakterleri çeşitli gruplara ayırabiliriz. Örneğin bir e-mail formatını ele aldığımızda basit anlamda örnek bir emaili düşünelim mert.kimyonsen@gmail.com olsun. Bu e-maili gruplandırarak geçerli bir formata olup olmadığını tespit edebiliriz. Bir yazı içinde e-maili bulduktan sonra e-mail adresinin kullanıcı adı, domain ismini (gmail) ve domain tipini (com) elde edebiliriz. Düzenli ifadeleri gruplamak için parantez kullanılır ve her bir grup için ayrı parantez kullanılmalıdır.

Basit düzeyde bir e-maili formatı doğrulayacak düzenli ifadeyi yazalım. \b(\w+)@(\w+)\.(\w+). Şimdi bu düzenli ifadeyi incelediğimizde \b ile kullanıcı adının tek bir kelime olmasını sağlıyoruz. \w+ ile belirtilen yerde alfenümerik karakterlerin bir ya da daha fazla olmasını sağlıyoruz. \. ile ilgili yerde . olmasını sağlıyoruz ancak düzenli ifadelerde . karakterinin özel bir anlamı olduğu için nokta karakteri \. şeklinde gösterilir.

Düzenli ifadeyi yazdık. Şimdi sıra bu düzenki ifadeyi kullanarak gruplara nasıl ulaşacağımızı düşünelim. Bunun için devreye Match sınıfını Groups özelliği devreye giriyor. Bu sayede her bir group’a ulaşabiliriz. Groups özelliğinede yine Match sınıfını Index özelliğini kullanarak ulaşabiliriz. Groups[1], Groups[2], Groups[3]…

Bu bilgiler ışığında konuyu pekiştirmek için örnek yapalım. Düzenli ifademiz \b(\w+)@(\w+)\.(\w+) ile e-mail formatını gruplayarak bazı özellikleri erkana yazdıracak bir örnek yapalım.

Regex sınıfının bir diğer önemli metotları ise Split() ve Replace() metotlarıdır. Split() metodu bir yazıyı belirli bir düzenli ifadeye göre parçalara ayırır ve string türünden bir diziye aktarıp bu dizinin referansı ile geri döner. String sınıfının Split() metoduna çok benzer.

Şimdi Split() metodunu kullanarak bir örnek yapalım.

Yukarıdaki örneği çalıştırdığımızda sayıların alt alta yazdığını göreceksiniz. Yazıyı parçalara ayırma işlemi bir ya da daha fazla virgül karakterine göre yapıyor. Bu işlemi sağlayan filtre ise “,+”.

Replace() metodu ise düzenli ifadeye uyan karakter dizilerin başka bir yazı ile yer değişmesidir.

Yukarıdaki örnekte isim.soyisim formatına uyan yazı yerine **** karakteri ile değişiyor.

Bu yazımda C# programlama dilinde Regular Expression (Düzenli İfadeler) hakkında elde ettiğim bilgileri paylaşmaya çalıştım. Umarım faydalı olmuştur

Bir sonraki yazımda görüşmek üzere 🙂

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik

https://docs.microsoft.com/tr-tr/dotnet/api/system.text.regularexpressions?view=netframework-4.8

Leave a Comment