Yazılım dünyasında bazı kavram ve yöntemler, o kadar geniş bir kullanım alanına sahiptirler ki, kullanılan dilden bağımsız olarak geliştirilmişlerdir. Her yazılım dili geliştiricisi bu yöntemi hazır olarak kullanır ve birçok kişi tarafından bilinirler. Regular Expressions bu kavramların belki de en çok bilinenlerindendir. Bu bilinirlik, kullanma noktasında aynı paralellikte değildir. IT profesyonelleri dahil kullananların birçoğu da gerçekte bilmeden kopyala-yapıştır ile hazır oluşturulmuş regExp örneklerini kullanırlar.
Günümüzde dört ayrı kullanım alanından söz edebiliriz.
- İstemci tarafında belli alanlarda veri girişi sırasında verinin kalite kontrolünün yapılmasında,
- Metin içinde arama yapılmasında,
- Metin içinde değişiklik yapılmasında
- Veri kalitesi işlemlerinde.
Tabii metin çok genel anlamdadır, bir text dosya da olabilir, veri tabanındaki bir alan da. Gelelim somut örneklere. Öncelikle başta belirttiğim kopyala-yapıştır ile kullanmaya örnek verelim. eposta örüntüsü
\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b
Bunu alıp bir metin içindeki bütün eposta adreslerini alabilir, alt alanlarına erişebilir, veya doğrudan düzenlediğiniz bir web sayfasında eposta alanına eposta olamayacak bir string girilmesini en baştan önleyebilirsiniz.
Bu yazımızda bilmeyenler veya bilmeden kullananlar için RegEx dünyasını biraz olsun bilinir kılmak istiyoruz. Öncelikle tanım. Bir metin içinde örüntü (pattern) aramak için özel amaçla bir araya getirilmiş karakter dizileridir. Örneğin, A dan Z ye kadar bütün harfler ve 0 dan 9 a kadar bütün sayılar içeren karakter gruplarının örüntüsü
[A-Za-z0-9]
Uygulamak esastır
Tabii anlamak için uygulamak gerek ve bunun için normalde geliştiricilerin kullandıkları, bazı editörler ve IDE lerin sundukları imkanlardan faydalanabiliriz. Ama ben son zamanlarda online güzel bir arayüzü olan iki siteyi kullanıyorum, Verinizin web de görünür hale gelmesi sizin açınızdan problem teşkil etmiyorsa kullanabilirsiniz. Birisi; regexr diğeri regex101 siteleridir. Ben bu yazıda RegExr i kullanacağım.
Örneğin, verilen bir metinde yukarıdaki örüntüyü kullanalım.
Hemen dikkatimizi çekiyor, türkçeye özgü harfler hariç harfler mavi ile boyandı. Bunun sebebi RegEx standartlarının ASCII karakter setine göre çalışmasıdır. Bu nedenle Türkçe için her bir harfi eklemek gerekiyor.
[âşöığüçiŞÖÜÇİA-Za-z0-9]
Bu şekilde bütün metni seçmiş olduk. Ama daha anlamlı bir iş yapalım. başında "s" harfi olan ve sonu "lar" ile biten kelimeleri seçmek isteyelim.
s[âşöığüçiŞÖÜÇİA-Za-z]+lar
Bunu yaptığımızda "s" ile başlayan belirttiğimiz karakterlerden bir veya daha fazlası ile oluşturulmuş sonu "lar" ile biten kelimeleri seçmemizi sağlar. "+" karakteri özel anlam olarak bir veya daha fazla anlamına geliyor. Alternatif bir özel karakter "*" ise sıfır veya daha fazla anlamında kullanılıyor.
Metin içindeki özel karakterleri bulmak istediğimizde karakterlerin başına "\" karakterini getirmemiz gerekebiliyor. Buna teknik olarak kaçış "escape" deniyor.Özel anlamından kaçıyorum sıradan bir anlamda kullanıyorum demektir. Ünlem işaretinin başında olmaması ise bunun özel anlamı olmadığı anlamındadır.
(!+|(\*)+|(\?)+|(\%)+|(\&)+|(\°)+|(\+)+|,+|\.(\.)+)
Tabii sadece bunlar olsa iş çok kolay olurdu. Şöyle bir arama yapmak istiyoruz. Her satırın ilk ve son kelimesi,
Burada "^" işareti satır başını, "$" işareti satır sonunu gösteriyor. En sondaki /g aramanın iteratif yani gidebildiği kadar yapılacağını, /m ise "^" ve "$" işaretçilerinin metnin her satırına uygulanacağını gösteriyor.
Burada amacımız yetenekleri göstermek olduğundan, ileri bir arama pattern inden bahsetmeden geçmeyelim. Lookahead ve lookbehind .
Pozitif ve negatif şeklinde iki ayrı kullanımı olan bu iki özel operatör bize çok kompleks örüntü arama imkanları kazandırmaktadır. Aradığımız örüntünün önünde veya sonrasında belli karakterlerin olması şeklinde koşul verme imkanı ve bu koşulların getirilen stringe dahil edilmemesi değişik aramalar yapabilmeyi sağlamaktadır. Örneğin, "lar" ile biten kelimeler.
Burada parantezlerin öneminden bahsedelim. her bir parantez 1 den başlayarak gruplama sağlıyor. Bu nedenle işaretlenen kelimeler grup2 ye giriyor. Yukarıda kelime başı ve sonu için verdiğimiz örnekte ise, satır başındaki kelime grup1 de satır sonundaki kelime grup2 dedir. Gruplara isim vermek mümkün olmakla birlikte geliştirme ortamına göre değişebilmektedir.
Bu konuda yazılım alanındaki her konuda olduğu gibi pratiğin önemli olduğu bir alan. Verdiğim sitelerden bu anlamda yararlanabilirsiniz.
Son olarak veri kalitesinde kullanımına bir örnek olarak, değişik formatta tarihlerin aynı formata getirilmesinde kullanılabildiğini söyleyelim.
[0-9]{4} ile dört dijitten oluşmuş her rakam, [-.] ile aralarda - veya . olabilir, [0-1][0-9] ile ilk basamağı 0 veya 1 diğeri 0 dan 9 a kadar herhangi bir sayı yani 00 dan 12 ye kadar aylar gibi. "|" işareti ise mantıktaki veya ile eş anlamlı, dolayısı ile iki ayrı regex veya ile birleştirilmiş.
Sonuç
Veri işleme ile az yada çok uğraşan her analistin, geliştiricinin alet çantasında olması gereken bir alet olan Regular Expressions, bilenler ile bilmeyenlerin bir olmadığı dünyanın vazgeçilmezlerindendir. Bu konudaki en iyi kaynak site regular-expressions.info sitesidir. Ben çokça faydalanıyorum, sizlere de tavsiye ederim.
Yorumlar