Merhabalar, bu yazımızda sizlere Regular Expression’lar ile ilgili bazı önemli örnekler göstereceğiz.
Bu örnekleri incelemeden önce temel bilgileri öğrenmek ve REGEXP fonksiyonlarında karakterlerin taşıdığı anlamlar tablosuna ulaşmak için
Regular Expression (REGEXP) Fonksiyonları yazımızı incelemelisiniz.
Oracle-SQL ‘de IsNumeric diye bir fonksiyon yoktur. Yani bir string alanı to_number() ile numeric yapmak istiyorsunuz fakat bazı satırlar için ‘invalid number’ hatasını alıyorsunuz. Hata aldığınız satırları bulmak için bu fonksiyonu kullanmak zorundasınız. Bu gibi örnekler için kullanabileceğimiz en basit yapı REGEXP_INSTR’dir.
REGEXP_INSTR(,’\D’) değeri için sıfırdan büyük değer içeriyorsa bu sütun sayısal yapıya sahip olmayan satırlar içeriyor demektir. Bunun için CASE yapısını kullanabiliriz ya da WHERE kısmına da ekleyebiliriz.
Select REGEXP_INSTR('060606ANKARA', ' \D' ) From Dual;
Sonuç : 7
Select CASE WHEN REGEXP_INSTR('06ANKARA', ' \D ') > 0 THEN 'Sayısal Değil' ELSE 'Sayısal' END From DUAL;
Sonuç : Sayısal Değil
Match Parameters :
\s : Boşluk karakteri
\S : Boşluk olmayan karakter
\d : Sayısal karakter
\D : Sayısal olmayan karakter
Ayrıca REGEXP fonksiyonları için, telefon numaraları karakterden oluşmazlar, onlar sayıdır. Sadece sayıları çekmek istiyorsak, köşeli parantez ‘[]’ kullanarak tanımlayabiliriz. Örneğin, 0′ dan 9′ a kadar olan rakamlardan oluşan bir eşleşme listemiz var ise bunu tanımlamanın bir kaç yolu var.
3 basamaklı sayı döndürecek bir ifade yazmanın bir kaç yolu vardır.
A-) [0123456789][0123456789][0123456789]
B-) [0-9][0-9][0-9]
C-) [0-9]{3}
Bu kalıbı kullanarak, telefon numaralarına daha dar bir şekilde odaklanan
bir telefon numarası ifadesi yazabilirsiniz.
Örnek: 999 ya da (999) şeklinde rakam seti barındıran sonuçları getirecektir.
SELECT REGEXP_SUBSTR('123 (999) 859 521 (204) 7856', '[0-9]{3}|\([0-9]{3}\)',1,5); FROM DUAL;
Sonuç : (204)
Backslash ( \ ) karakterinin özel bir anlamı var. Kendisinden sonra gelen karakterde özel karakter olarak değerlendirmemesi gerektiğini ifade eder.
Örneğin: \([0-9]{3}\) bu ifade de açık-kapalı parantezin özel bir anlamı yoktur. Parantez içinde 3 basamaklı sayı arayacaktır. ( ) gördüğü için onu bir substring olarak değerlendirmeyecektir.
REGEXP_LIKE ile kullanımında yine benzer şekilde yazabilriz;
REGEXP_LIKE(<column_name>,‘[0-9]{3}|\([0-9]{3}\)’)
Örnek: Last_Name alanında boşluk(space) karakteri barındıran satırlar
Select FIRST_NAME, LAST_NAME, PHONE_NUMBER, SALARY From Employees Where REGEXP_LIKE(LAST_NAME, '(\s)');
Sonuç : Lex De Haan 515.123.4569 17000
Örnek: Büyük harf ile başlayıp küçük harf ile devam eden, 3. kelimeyi getiren sorgu
SELECT REGEXP_SUBSTR ( 'Hiçbir şeYe ihtiyacımız yok, Yalnız bir şeye iHtiyacımız vardır; Çalışkan Olmak !', '(^[A-Z-İĞÜŞÖÇ][a-z-_ığüşöç]*)|(\s[A-Z-İĞÜŞÖÇ][a-z-_ığüşöç]*)', 1, 3) AS REG_EXP_SUB_STR FROM DUAL;
Sonuç : Çalışkan
Yukarıdaki örnekte Pattern olarak belirlediğimiz koşulu inceleyecek olursak;
( -koşul1- | -koşul2- ) : koşul1 Ya Da koşul2 ‘ye uyuyorsa devam et..
koşul1: (^[A-Z-İĞÜŞÖÇ][a-z-_ığüşöç]*)
Metin dizesinin en başında içerisinde Türkçe karakterlerinde bulunduğu bir büyük harfle başlayıp küçük harf ile devam eden bir kelime varsa getir.
koşul2: (\s[A-Z-İĞÜŞÖÇ][a-z-_ığüşöç]*)
Metin dizesinin içerisinde Türkçe karakterlerinde bulunduğu bir büyük harfle başlayıp küçük harf ile devam eden bir kelime varsa getir.
İki koşulu birden değerlendirdiğinde:
‘Hiçbir şeYe ihtiyacımız yok, Yalnız bir şeye iHtiyacımız vardır; Çalışkan Olmak !’
Bu dört kelimeyi bir listede toplayacak ve siz kaçıncı kelimeyi istiyorsanız onu getirecek.
Dikkat edilmesi gereken noktalar:
- Eğer koşul2’de \s operatörünü koymazsak listemize ‘Htiyacımız‘diye bir kelime daha ekleyecek.
- \s operatörü, büyük harften önce bir boşluk karakteri olması gerektiğini söylüyor.
- Sadece koşul2‘yi tanımlayıp, koşul1‘i eklemezsek listemize ‘Hiçbir‘ diye bir kelime eklemeyecek yani cümleye boşluk bırakarak başlamadığında en baştaki kelimeyi atlayacak.
I. Yöntem : (^[A-Z-İĞÜŞÖÇ][a-z-_ığüşöç]*)|(\s[A-Z-İĞÜŞÖÇ][a-z-_ığüşöç]*)
II. Yöntem : (^| )([A-Z-İĞÜŞÖÇ][a-z-_ığüşöç]*)
REGEXP fonksiyonları kullanırken, bize sağladığı diğer önemli bir özellik ise backreference‘dır. Backrefrence özelliği desen(pattern) tanımlarken, altdizgi(substring)’ler arasında referans göstermemizi sağlar.
Örneğin: REGEXP_REPLACE(<sutun_adı>, ‘(-koşul1-)[-. ](-koşul2-)‘, ‘\1-\2’)
(-koşul1-) ve (-koşul2-) bir substring(altdizgi) olarak değerlendirilir.
Referans gösterirken; \1 yazarak 1. substring’i, \2 yazarak 2. substring’i referans gösteriyoruz.
Örnek : Kişi adı ve soyadının ilk iki harfi hariç diğer harfleri yıldız ile gizleyerek yazdırma
( Ayşe Kaya ) – ( Ay** Ka** )
( Orhan Veli Kanık) – ( Or*** **** Ka*** )
- Durum isim bilgisini tek sütun (User_Name gibi) üzerinde tutuyorsak;
Select SUBSTR('Mina Tuana Yılmaz',0,INSTR('Mina Tuana Yılmaz',' ',-1)) F_NAME, SUBSTR('Mina Tuana Yılmaz',INSTR('Mina Tuana Yılmaz',' ',-1)) L_NAME, REGEXP_REPLACE(SUBSTR('Mina Tuana Yılmaz',0,INSTR('Mina Tuana Yılmaz',' ',-1)),'\w','*',3) FIRST_NAME, REGEXP_REPLACE(SUBSTR('Mina Tuana Yılmaz',INSTR('Mina Tuana Yılmaz',' ',-1)),'\w','*',3) LAST_NAME From Dual;
Sonuç :
Mina Tuana | Yılmaz | Mi** ***** | Y*****
2. Durum isim bilgisini iki farklı sütun (First_Name, Last_Name gibi) üzerinde tutuyorsak;
Select REGEXP_REPLACE('Mina Tuana','\w','*',3), REGEXP_REPLACE(' Yılmaz','\w','*',3) From Dual;
Sonuç :
Mi** ***** | Y*****
Örnek : Metin içerisinde “3 basamaklı sayı + (tire ya da nokta ya da boşluk) + 4 basamaklı sayı” şeklinde bir desene rastladığında, o yapıyı yeniden düzenlemesini istiyoruz. Düzenlerken de, ortasında karakterin yerine * koymasını istiyoruz.
Select REGEXP_REPLACE('652.0404, 320 2424, 212-8686 850 962 7878 2564', '([0-9]{3})[-. ]([0-9]{4})', '\1*\2') From Dual;
Önce : 652.0404, 320 2424, 212-8686 850 962 7878 2564
Sonra : 652*0404, 320*2424, 212*8686 850 962*7878 2564
[0-9]{3} : 3 basamaklı sayı arar (birinci_substring)
[0-9]{4} : 4 basamaklı sayı arar (ikinci_substring)
[-. ] : içerisinde Tire, Nokta ya da Boşluk var mı diye bakar
Peki iki sayı arasına * koymasını sağlayan deseni nasıl oluşturacağız?
-> Backrefrence kullanarak.
‘\1*\2’ dediğimizde ‘birinci_substring*ikinci_substring‘ şeklinde yeniden yapılandırmasını sağlayacak.
Örnek : Soyadında iki tane ünlü harf yan yana olan kişiler
(büyük-küçük harf duyarlı olmadan)
SELECT LAST_NAME FROM EMPLOYEES WHERE REGEXP_LIKE (LAST_NAME, '([aeiou])\1', 'i');
Sonuç :
Bloom
De Haan
Feeney
Gee
Greenberg
Greene
Khoo
Lee
Örnek : Soyadında iki tane ünsüz harf yan yana olan kişiler
(büyük-küçük harf duyarlı olmadan)
SELECT LAST_NAME FROM EMPLOYEES WHERE REGEXP_LIKE (LAST_NAME, '([^aeiou])\1', 'i');
Sonuç (ilk 10 Satır) :
Bell
Bissot
Bull
Dellinger
Dilly
Errazuriz
Everett
Fripp
Hall
Higgins
Geri bildirim: Regular Expression (REGEXP) Fonksiyonları | İş Zekası ve Veri Tabanı Yönetimi
Geri bildirim: Yeni dünyalar keşfetmeye devam ediyoruz :) #Bidunyasi.wordpress.com | MyLifeMyPc