Oracle’da Düzenli İfadeler (Regular Expressions)
Regular Expressions yani düzenli ifadeler bir yazı içerisinde arama yaparken kullanabileceğimiz desenlere verilen addır. Düzenli İfadeler uzun yıllardır özellikle Unix sistemlerde kullanılmakta olup artık bir POSIX (Portable Operating System Interface [for Unix]) standardı haline gelmiştir. Bir çok programlama dili ve platformu (Perl, PHP, .NET, Java gibi) düzenli ifadeleri ve desen eşleştirme teknolojisini desteklemektedir.
Oracle, IEEE’nin düzen ifadeler standartlarına ve Unicode Konsorsiyumunun Unicode Regular Expression kılavuzuna uygun olarak düzenli ifadeleri desteklemektedir.
Düzenli İfadeler desteği, LIKE ile yapılan aramaların desenler ile yapılması gibi düşünülebilir. Bir iki örnek ile konuyu anlaşılır hale getirmeye çalışalım. Burada anlatılan sorguları rahatlıkla deneyebilmeniz için sorguları Oracle’ın HR schemasında çalıştıracağım.
Diyelim ki ismi A ile başlayan çalışanları sorgulamak istiyorum:
SQL> SELECT first_name, last_name FROM employees WHERE first_name LIKE ‘A%’;
Göreceğiniz üzere istediğimiz sonucu elde edebildik:
Bu tip bir sorguyu LIKE ile yapmak gayet kolay, ama eğer biz çok daha detaylı bir arama yapmak istersek, bunu LIKE ile yapmak için çok karışık ve efektif olmayan sorgular yazmamız gerekir. Örneğin ilk harfi A, ikinci harfi “l” veya “d” olan, son harfleri “r” veya “a” olan çalışanları listelemek gibi nispeten karışık bir sorgu yazmak istersek, düzenli ifadeler işimizi kolaylaştıracaktır:
SQL> SELECT first_name, last_name FROM employees
WHERE REGEXP_LIKE( first_name, ‘A[ld].*[ar]$’ );
Bu sorgunun sonucuna bakmadan önce sorguda nasıl bir koşul kulandığımıza bakalım. REGEXP_LIKE operatörü LIKE operatörüne benzemesine karşın eşleştirmeyi düzenli ifadeler desenlerini kullanarak yapıyor. İlk argüman olarak arama yapılacak kolonu, ikinci argüman olarak bir düzenli ifadeyi veriyoruz.
Düzenli ifadelerin desen eşleştirmesi yaptığını söylemiştim. A[ld].*[ar]$ kısmı bizim desenimiz. Bu desen ilk harfi A olan, ardından l veya d gelen ve en son harfi a veya r olan karakter dizilerini ifade ediyor. Desenler, kelimer içinde aranmaz. Kolonun içerdiği tüm değer içerisinde bu eşleştirme yapılacaktır.
Sorguyu çalıştırınca şu sonucu alıyoruz:
Eğer çalışanlardan birinin adı “Adam Amir” olsaydı listede o da çıkacaktı. Düzenli ifadelerde sıklıkla kullanılan bazı karakterler şunlar:
^ Satırın başını işaret eder (aslında örnek sorguda kullanabilirdik ^A…. )
$ Satırın sonunu işaret eder
. Her hangi bir karakter
* Bu işaretten daha önce gelen ifadeyi sıfır veya daha çok kez eşleştir
? Bu işaretten daha önce gelen ifadeyi sıfır veya bir kez eşleştir
+ Bu işaretten daha önce gelen ifadeyi en az bir kez eşleştir
{x} Bu işaretten daha önce gelen ifadeyi “x” kez eşleştir
{x,} Bu işaretten daha önce gelen ifadeyi en az “x” kez eşleştir
{x, y} Bu işaretten daha önce gelen ifadeyi en az “x”, en çok “y” kez eşleştir
[abc] Köşeli parantezler içersinde verilen karakterler bir liste olarak kullanılır
Burada yazdıklarımı örnek sorgudaki deseni anlamlandırmakta kullanalım:
A -> Bu özel bir karakter değil, desenimizin ilk harfi A
[ld] -> l ve d’den oluşan bir liste, A’dan sonra gelen harf bu liste içerisinde olması gerektiğinden, ikinci harf l veya d olacak
.* -> Arada istenilen harf olabilir
[ar] -> Rastgele harflerden sonra bu listedeki harflerden biri gelecek (a veya r)
$ -> Satır sonu (bu sayede en son harflerin a veya r olduğunu söylemiş olduk
Oracle, düzenli ifadeler için REGEXP_LIKE dışında şu fonksiyonlara sahiptir:
REGEXP_COUNT: Aranılan desenden kaç tane olduğunu gösterir
REGEXP_REPLACE: Aranılan deseni istenildiği gibi değiştirerek sonucu verir (replace’in düzenli ifadeler destekli hali)
REGEXP_SUBSTR: Aranılan desenle eşleşen karakterleri verir
REGEXP_INSTR: Aranılan desenin verinin kaçıncı karakterinde başladığını verir (ilk karakter 1)
Bu fonksiyonlarla ilgili daha ayrıntılı bilgi için şu sayfaya göz atabilirsiniz:
http://psoug.org/reference/regexp.html
Ayrıca düzenli ifade eşleştirmelerinde daha kolay desen oluşturmak için şu online aracı kullanabilirsiniz:
http://www.gskinner.com/RegExr/
Düzenli ifadelerin gücünü daha iyi anlayabilmeniz için, bir email adresinin düzenli ifadelerle nasıl kontrol edilebileceğine bakalım:
SQL> SELECT ‘gokhan@email.com’ gecerli FROM dual
WHERE regexp_like(‘gokhan@email.com’,
q’#^[a-zA-Z][a-zA-Z-\.]+@[a-zA-Z-\.]+\.[a-zA-Z]{2,4}$#’);
Bu deseni ben oluşturdum bu yüzden kesinlikle doğrudur diye kabul etmeyin, ama sizin çalışmalarınız için iyi bir başlangıç olabilir.
Gökhan Atıl tarafından yayınlandı




