Veritabanı Tasarımı Düzenli İfadeler
Konular Düzenli ifadeleri tanımlama SQL ifadelerinde düzenli ifadeleri arama, eşleme ve yer değiştirme katarlarında kullanma Düzenli ifadeleri ve kontrol kısıtlamalarını oluşturma ve çalıştırma 2
Amaç Bazen bir sütundaki, metin katarı veya belgedeki belirli bir metni aramak ya da değiştirmek zorunda olabilirsiniz. Zaten LIKE ve joker karakter kullanarak basit desen eşleştirme gerçekleştirmeyi biliyorsunuz. Bazen belirtilen metinde Winchester kelimesini bulmak ya da bir metin parçasından tüm URL'leri ayıklamak gibi çok karmaşık metin dizelerine bakmanız gerekebilir. Diğer zamanlarda her ikinci karakteri sesli olan tüm kelimeleri bulmanız gibi daha karmaşık aramalar yapmanız istenebilir. 3
Amaç Düzenli ifadeler arama ve değiştirme için hem basit hem de karmaşık modellerdir. Bilgi işleme endüstrisinde sıklıkla kullanılır ve Oracle ile sınırılı değildir. Oracle düzenli ifadeler uygulaması POSIX in uzantısıdır ve IEEE tarafından kontrol edilen bu standart ile tamamen uyumludur. 4
Düzenli İfadeler Düzenli ifadelerin kullanılması meta karakterlerin kullanımına dayanmaktadır. Meta karakterler, joker bir karakter, yinelenen bir karakter, eşleşmeyen bir karakter ya da bir karakter aralığı olarak özel bir anlama sahip özel karakterlerdir. Desen eşleştirmede önceden tanımlanmış bir meta karakter sembolü kullanabilirsiniz. Bir sonraki sayfalarda meta karakterler listelenmekte ve her biri için kısa açıklama verilmektedir. 5
META Karakterler Sembol Açıklama * Sıfır veya daha fazla örnekle eşleşir Alternatif eşleşmeleri belirtmek için kullanılan eşleşme operatörü ^/$ Satır-başlangıcı / Satır-sonu eşleşmesi [ ] Listede verilen ifadelerin herhangi biri ile eşleşen, eşleşme listesi köşeli parantez arasında belirtilir {m} {m,n} m kere tam eşleşme En m kere fakat en fazla n kere eşleşme [: : ] Bir karakter sınıfını belirtir ve bu sınıfta herhangi bir karakterle eşleşme 6
META Karakterler Sembol Açıklama \ 4 farklı anlama sahip olabilir: 1. Kendisi için duran 2. Bir sonraki karakteri tırnaklar 3. Bir operatörü tanıtır 4. Hiçbir şey yapmaz + Bir ya da daha çok tekrarı eşler? Sıfır yada bir tekrarı eşler. Desteklenen karakter setinde NULL hariç herhangi bir karakteri eşler ( ) Tek bir alt-ifade olarak kullanılan gruplama ifadesi [==] Eşitlik sınıflarını belirtir \n Geri-referans ifadesi [..] Çok karakterli bir eleman olarak bir harmanlama elemanı belirtir 7
Düzenli İfade Örnekleri Basit bir düzenli ifade aşina olduğunuz joker aramalarına çok benzerdir. Bir örneğe bir göz atalım: Nokta operatörü kullanarak a ile c arasında bulunan herhangi bir karakteri arayalım. Düzenli bir ifade olarak bu a.c şeklinde olmalıdır. Aynı ifade SQL standart joker araması olarak şu şekildedir: WHERE sütun LIKE a_c. 8
Düzenli İfade Örnekleri Aşağıdaki ifadelerden hangileri a.c ile eşleşmektedir? ABC, abc, aqx, axc, abc, abc, Amc, amrc 9
Düzenli İfade Örnekleri Kırmızı işaretli olan katarlar a.c arama katarı ile eşleşmektedir. ABC, abc, aqx, axc, abc, abc, Amc, amrc Diğer örnekler ya harfin yanlış yerde olması ya da büyük/küçük harf ifadesinin yanlış olmasından kaynaklanmaktadır. 10
Düzenli İfade Örnekleri Adı Stephen veya Steven olan tüm çalışanların listelenmesinin istendiğini varsayalım. Şayet standart Oracle joker aramasını kullanırsanız bu başarmak için zor olacaktır fakat düzenli ifadelerle bunu şu şekilde ifade edebiliriz: ^Ste(v ph)en$ ^ aranan katarın başlangıcını ifade eder S büyük harf t küçük harf e küçük harf 11
Düzenli İfade Örnekleri ^Ste(v ph)en$ ( bir grup başlatır v küçük harf VEYA ifadesi p küçük harf h küçük harf ) seçilen grubu bitirir e küçük harf n küçük harf $ aranan katarın sonunu belirtir 12
Düzenli İfade Fonksiyonları Oracle, düzenli ifadeler kullanarak katarlarda arama ve değişiklik için bir SQL fonksiyonları kümesi sağlar. Bu fonksiyonları CHAR, CLOB ve VARCHAR2 gibi karakter verileri tutan herhangi bir veri türünde kullanabilirsiniz. Bir düzenli ifade tek tırnak işareti içinde verilmelidir. 13
Düzenli İfade Fonksiyonları Ad REGEXP_LIKE REGEXP_REPLACE REGEXP_INSTR REGEXP_SUBSTR REGEXP_COUNT Açıklama LIKE operatörüne benzer fakat basit model eşleme yerine düzenli ifade eşlemesi gerçekleştirir. Düzenli bir ifade modeli için arama yapar ve onu değiştirme katarı ile değiştirir. Verilen bir katar için verilen bir düzenli ifade modeli arar ve eşleşmenin bulunduğu pozisyonu geri döndürür. Verilen katar için düzenli bir ifade modeli arar ve eşleşen alt katarı geri döndürür. Bir katarda bir modelin tekrar edilme sayısını geri döndürür. Katarı ve modeli belirtmelisiniz. Ayrıca başlangıç pozisyonunu ve eşleme seçeneklerini belirtebilirsiniz. 14
Düzenli İfade Fonksiyonu Örnekleri REGEXP_LIKE düzenli ifadesinin kullanımı Steven veya Stephen listeleme probleminin çözümü için kullanılabilir: 15
Düzenli İfade Fonksiyonu Örnekleri Sayı ile başlamayan adreslerin aranması ve bu adresteki ilk alfa olmayan karakterin pozisyonunun listelenmesi şu şekilde yapılabilir: Açıklama ve sonuçlar bir sonraki sayfada bulunabilir. 16
Düzenli İfade Fonksiyonu Örnekleri [ ifadenin başlangıcını belirtir ^ parantez içinde belirtildiği zaman NOT anlamına gelir [:alpha:] numaralar gibi alfa karakter sınıfını belirtir ] ifade sonunu belirtir 17
Düzenli İfade Fonksiyonu Örnekleri Sokak adresinde, ilk alfabetik olmayan karakter 9. karakter pozisyonundaki boşluk karakteridir. Bu sokak adresleri 123 F gibi numara ile başlar. Sokak, alfabetik olmayan ilk karakterine 1. karakter pozisyonunda sahiptir ve WHERE deyimi kullanarak arama dışına alınır. 18
Düzenli İfade Fonksiyonu Örnekleri Bir cümle içeren bir sütundaki sadece ikinci kelimeyi geri döndürmek için aşağıdaki ifadeyi çalıştırabilirsiniz: Herhangi bir boşluk olmayan [^ ]+ karakterin bir ya da daha fazla tekrarını bulur. Bu da ayrıca tek bir boşlukla ve devamında yine tek bir boşlukla [^ ]+ takip eder. 19
Düzenli İfade Fonksiyonu Örnekleri [ ifade başlangıcını belirtir ^ NOT ifadesini belirtir bir boşluk belirtir ] ifadenin bitimini belirtir + bir ya da daha fazla olayı belirtir bir boşluğu belirtir 20
Düzenli İfade Fonksiyonu Örnekleri Düzenli ifadeler, veritabanında sadece tutarlı verilerin saklanmasını sağlamak için uygulama kodlarının bir parçası olarak da kullanılabilir. Örneğin bir CHECK kısıtlaması gibi bir düzenli ifade fonksiyonu çağırmak için içermesi mümkündür. 21
Düzenli İfade Fonksiyonu Örnekleri Veritabanınızdaki bir tabloda @ sembolü olmayan bir mail adresi olmamasını istediğinizde aşağıdaki basit kontrol kısıtlamasını ekleyebilirsiniz: Bu tüm mail adreslerinin @ işareti içermesini sağlayacaktır. 22
Kontrol Kısıtlamalarında Düzenli İfadeler Diğer örnek telefon numaralarını formatlarının kontrolü olabilir: Bu kısıtlama tüm telefon numaralarının (XXX) XXX-XXXX formatında olmasını sağlar. 23
Kontrol Kısıtlamalarında Düzenli İfadeler ^ katar başlangıcı \( ters bölüde (\) bir sol parantez, sol parantezi izleyen gruplama ifadesi yerine bir dizgiyi belirten bir çıkış karakteri olarak kullanılır. \d{3} Tam üç basamaklı \) Sağ parantez. Ters bölü (\) işareti önce gelen bir çıkış karakteridir. (space character) Boşluk karakteridir. 24
Kontrol Kısıtlamalarında Düzenli İfadeler \d{3} Tam üç basamaklı - Tire \d{4} Tam dört basamaklı $ Katarın bitimi. 25
Kontrol Kısıtlamalarında Düzenli İfadeler Aşağıdaki satır çalışmalı: Aşağıdaki satır çalışmamalı: 26
Kontrol Kısıtlamalarında Düzenli İfadeler Kontrol kısıtlamasında düzenli ifadelerin bir başka kullanımı VARCHAR2 veya CHAR sütununun numara almasına izin vermediğinden emin olmak olabilir: [[:digit:]] ifadesi rakam veya sayısal değerleri tespit eden son ek ifadesidir. REGEXP_INSTR herhangi bir rakamın pozisyonunu geri döndürür ve şayet dönen değer 0 değilse kısıtlama başarısız olur. 27
Kontrol Kısıtlamalarında Düzenli İfadeler Natacha Hansen iletişim ismi veritabanı tarafından kabul edilmelidir çünkü regexp_instr tarafından geri döndürülen sayı 0 olmalıdır. regexp_instr( Natacha Hansen,'[[:digit:]] ) ifadesi 0 döndürür bu nedenle ekleme çalışmaz. 28
Kontrol Kısıtlamalarında Düzenli İfadeler Örneğin Natacha Hansen 1 gibi bir isme numara eklemek istersek ekleme hata verir. regexp_instr( Natacha Hansen 1,'[[:digit:]] ) ifadesi 16 değerini geri döndürür. 16=0 doğru olmadığı için ekleme başarısız olur. 29
Alt İfadeler Oracle 11g de düzenli ifadeleri kullanırken ayrıca alt ifadeleri kullanabiliriz. Parantezler ifade içerisinde alt ifadelerin belirlenmesi için kullanılır ve REGEXP_INSTR ve REGEXP_SUBSTR fonksiyonlarında desteklenir. 30
Alt İfadeler Aşağıdaki ifadeye bakın: (1 2 3) (4 (5 6) (7 8) ) Buradaki alt ifadeler: A. 1 2 3 B. 4 5 6 7 8 C. 5 6 D. 7 8 31
Alt İfadeler Alt ifadeler özellikle gerçek kelimelerde kullanışlıdır: örneğin DNA zincirlemesi ile çalışırken. Bir fare DNA zincirleri kısmi örneğine bakalım: ccacctttccctccactcagttctcacctgtaaagcgtccctccctcatccccatgcccccttaccg cagggtagagtaggctagaaaccagagagctccaagctccatctgtggagaggtgccatcctt gggctgcgagagaggagaatttgcccaaagctgcctgtttgaacgatggagacatgattgccg taaagggtcctgaatgcatgagatgtctttcgagagtaccggttacgggttaaaaggtcatgaga cttcgatcattacgatcgtggttaacacacatatgagtatagagacacattggccaagagttgag attgagag 32
Alt İfadeler DNA zincirlemesi ile çalıştığınızı ve gtc ile başlayan tcac ve daha sonra aaag ile devam eden belirli bir sıralamanın başlangıç pozisyonunu bulmak zorunda olduğunuzu hayal edin. Bu, eşleşmenin bulunduğu pozisyonu geri döndüren REGEXP_INSTR fonksiyonu ile kolay bir şekilde gerçekleştirilir. 33
Alt İfadeler 34
Alt İfadeler 35
REGEXP_COUNT Oracle 11g ayrıca yeni bir düzenli ifade fonksiyonuna sahiptir: REGEXP_COUNT. Bu fonksiyon bir katar içerisinde bir desenin kaç kez tekrar göründüğünü harika bir şekilde belirtir. 36
REGEXP_COUNT Fare DNA örneğini kullanarak, şayet DNA örneğinde gtc deseninin kaç defa sunulduğunu hesaplamak istersek, basitçe onları sayarız. 37