2. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
GÜNDEM
RegEx Nedir ?
RegEx Kullanım Alanları
Pattern Nedir ?
Oracle RegEx Fonksiyonları
Metacharacters
Match Parameters
Oracle RegEx Fonksiyon Örnekleri
3. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Regular Expression Nedir ?
String içerisinde belli bir kelime ya da daha karmaşık olan belli bir dizilime sahip
bir bilgiyi bulmak için kullanılan bir metoddur. Arama işleminde belli bir kural
dahilinde uzunluk ve tip belirtip buna uygun verileri tespit etmemizi
sağlamaktadır.
Örneğin , web sitelerinde şifre tanımlamalarında en az bir noktalama
işareti olmalıdır diye bir uyarı verilir. Bu doğrulamayı kolaylıkla RegEx ile
yapabiliriz.
Günümüzde yazılım dillerinin başlıcaları (Phyton ,C#, Java , SQL, Javascript vb.)
regular expression kütüphaneleri ile bu yöntemi sağlamaktadır. Bu yazıda Oracle
Db üzerinde regular expression fonksiyonları nelerdir, bu fonksiyonlar ile hangi
problemlere çözüm bulabiliriz örnekler ile inceleyeceğiz.
4. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Regular Expression Kullanım Alanları
Regular expression kullanımı genelde kompleks bir aramaya ihtiyaç
duyulduğunda başvurulan bir metoddur.
Genel olarak kullanım alanı database’den çok application ya da client(Java , C#,
Javascript vb.) tarafında diyebiliriz.
Email , password validasyonu
Kredi kartı , IBAN validasyonu
Telefon , posta kodu
Kompleks arama ( HTML kodu içerisinde sadece img tag’i arama)
5. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Pattern nedir ?
Pattern, yazılım ile ilgili bir çok konu alanında farklı anlamlar ifade
edebilmektedir. Regular expression konu alanı için ise pattern aranılan verinin
deseni veya şablonu diyebiliriz. Kimlik numarasının 11 haneli , kredi kartının 16
haneli ya da e-posta adreslerinin @ işareti içermesi bu tip verilerin
desenidir(pattern) diyebiliriz.
RegEx patterni oluşturmak için ise bazı bileşenler gerekmektedir.
Metacharacters
Character class
<?! pattern @%>
6. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Oracle Regular Expression Fonksiyonları
SQL Fonksiyonu Açıklama
REGEXP_LIKE
Belirtilen pattern doğrultusunda karakter seti içerisinde arama yapmak için kullanılır.
WHERE koşulunda kullanıldığında eşleşen kayıtlar seçilebilir.
REGEXP_REPLACE
Karakter dizisinde belirtilen patterndeki eşleşen değerleri arar ve değiştirilmesi istenen
değer ile günceller.
REGEXP_INSTR
Verilen regular expression patternin hangi indexten itibaren başladığını belirtir.
REGEXP_SUBSTR
Regular expression patterni ile eşleşen ilk değeri döndürür.
REGEXP_COUNT
Regular expression patterni ile eşleşen kaç adet veri seti olduğu sonucunu döndürür.
Oracle’ın sunduğu regular expression fonksiyonları nelerdir aşağıdaki tabloda
açıklamaları ile birlikte yer almaktadır. Bu fonksiyonlar yardımıyla ihtiyaç
duyduğumuz sonuca uygun bir sorgu oluşturabiliriz.
7. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Metacharacters
Sembol Açıklama
* Sıfır veya daha fazla karakter anlamına gelir
|
Alternatif eşleşmeleri belirtmek için kullanılan
eşleşme operatörü (OR operatörü diyebiliriz.)
^/$ İle başlar / İle biter ifadesi için kullanılır
[ ]
Listede verilen ifadelerin herhangi biri ile eşleşen
eşleşme listesi köşeli parantez arasında belirtilir
{m} m defa eşleşme olacağını belirtir
{m , n} En az m kere fakat en fazla n kere eşleşme
[: : ]
Bir karakter sınıfını (character class) belirtir ve bu
sınıfta herhangi bir karakterle eşleşme
Kendinden sonraki özel karakterin stringe dahil
edilmesini sağlar
+ 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
Metacharacters regular expression için pattern oluşturmada kullanacağımız
formatlardır. Tek ya da çoklu olarak kullanılabilmektedir.
8. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Match parameter – Modes (Eşleştirme parametreleri)
Eşleştirme parametreleri tüm regular expression fonksiyonları için input değişkeni
olarak verilebilmektedir.
Aşağıda belirtilen değerler verilerek eşleştirme modları ihtiyacımıza göre
şekillendirilebilmektedir.
* Eğer birbiri ile zıt bir match parameter değeri verilirse Oracle son tanımlanan
değeri alır. Örneğin ‘ic’ şeklinde tanımlanırsa , oracle case-sensitive özelliği açık
olarak bir arama işlemi gerçekleştirir. Oracle’da tanımlı değerler dışında bir değer
verilirse hata almaktadır.
Sembol Açıklama
i
Küçük büyük harf duyarlılığı kapalı olarak arama
yapılır. (case insensitive)
c
Küçük büyük harf duyarlılığı açık olarak arama
yapılır. (case sensitive)
n
Herhangi bir karakterle eşleşecek ve aynı şekilde
yeni satır karakteriyle eşleşecektir
m
Multiline içeren string içerisinde arama yapılabilir.
Default halinde string tek satır olarak baz
alınmaktadır.
x
Aranılan pattern içerisinde boşluk karakterine izin
verir
9. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Character Class (Karakter sınıfı)
Karakter sınıfları bir grup ya da aralığı ifade eden karakter kümelerini barındırır.
Pattern tanımlamalarında ihtiyaç duyulan bir syntaxdir. Aşağıda sembol ve
açıklamalarına yer verilmiştir.
Sembol Açıklama
[:upper:] Büyük harfler [A-Z)]
[:lower:] Küçük harfler [a-z]
[:alpha:] Tüm harfler [A-Za-z]
[:alnum:] Rakam ve harfler [0-9A-Za-z]
[:digit:] Rakamlar [0-9]
[:xdigit:]
Hexadecimal digits {
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,a,b,c,
,d,e }
[:punct:]
Noktalama işaretleri
! " # $ % & ' ( ) * + , - . / : ; < = > ?
@ [ ] ^ _ ` { | } ~
[:blank:] Boşuk ve tab
[:space:] Boşluk karakteri
[:cntrl:]
Kontrol karakterleri
ASCII 000-037 aralığı ve 177(DEL)
[:graph:] [:alnum:] ve [:punct:]
[:print:] [:alnum:] , [:punct:] ve boşluk
[:word:] Rakamlar , harfler ve underscore
10. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Oracle Regular Expression Fonksiyonları
REGEXP_LIKE
REGEXP_LIKE(source_string, regexp_pattern , [modes] )
REGEXP_LIKE fonksiyonu, yalnızca verilen patterne uygun bir sonuç olup olmadığını
belirten boolean (true ya da false) bir sonuç döndürmesi sebebiyle diğer REGEX
fonksiyonlarına göre farklıdır. Eşleşmenin nerede ve nasıl sağlandığına dair bir sonuç
döndürmez.
Örnek olarak bir tablonun içinde ‘uç’ ile başlayan bazı kelimeler aradığımızı
varsayalım. (Uçak , Uçurtma ,Uçmak, Uçurum)
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, 'uç(urum)|(ak)|(mak)|(urtma)' , 'i')
*[] içinde yazılan input parametreleri zorunlu parametreler değildir.
‘i’ modes parametresi
ile incasesensitive
arama yapılmaktadır.
Parantez içinde ‘uç’ kelimesinden sonra
alabileceği değerler belirtilmeli ve ‘|’ karakteri
ile veya olduğunu belirten komut yazılmalıdır.
Parantez içinde ‘uç’ kelimesinden sonra
alabileceği değerler belirtilmeli ve ‘|’ karakteri
ile veya olduğunu belirten komut yazılmalıdır.
11. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Oracle Regular Expression Fonksiyonları
REGEXP_REPLACE
REGEXP_REPLACE(source_string, regexp_pattern, replacement, [position], [occurrence], [modes])
REGEXP_REPLACE fonksiyonu da yine bir Oracle fonksiyonu olan REPLACE
fonksiyonuna benzer şekilde, belirtilen pattern ile eşleşme yakalandığında input
olarak verilen replacement parametresi ile güncellenir.
Kullanım alanlarına veri formatlama, veri temizleme vb. örnekler verebiliriz.
Örneğin , telefon numarası veritabanında number olarak 5548366432 olarak
tutulduğunu varsayalım. Telefon numarasını (554) 836 64 32 olarak formatlamaya
ihtiyaç duyduğumuzda bu fonksiyon yardımıyla kolaylıkla oluşturabiliriz.
1 2 3 4
select
REGEXP_REPLACE(tel_nbr, '([[:digit:]]{3})([[:digit:]]{3})([[:digit:]]{2})([[:digit:]]{2})',
'(1) 2 3 4') as res
from (
select 5548366432 as tel_nbr from dual
) t
Result : (554) 836 64 32
12. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Oracle Regular Expression Fonksiyonları
REGEXP_REPLACE
REGEXP_REPLACE(source_string, regexp_pattern, replacement, [position], [occurrence], [modes])
Res_2 kolonunda REGEX_REPLACE fonksiyonu kullanmadan aynı sonucu nasıl elde
edebileceğimizi görebiliriz.
select
REGEXP_REPLACE(tel_nbr, '([[:digit:]]{3})([[:digit:]]{3})([[:digit:]]{2})([[:digit:]]{2})',
'(1) 2 3 4') as res,
'(' || SUBSTR(tel_nbr , 1, 3 )||')'|| ' ' | |SUBSTR(tel_nbr , 4, 3 ) || ' ' ||SUBSTR(tel_nbr
, 7, 2 ) || ' ' || SUBSTR(tel_nbr , 9, 2 ) as res_2
from (
select 5548366432 as tel_nbr from dual
) t
Result : (554) 836 64 32
13. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Oracle Regular Expression Fonksiyonları
REGEXP_INSTR
REGEXP_INSTR(source_string, regexp_pattern, [position], [occurrence], [return_option], [modes])
REGEXP_INSTR fonksiyonu da yine bir Oracle fonksiyonu olan INSTR fonksiyonunu
genişleten bir fonksiyondur diyebiliriz. Fonksiyon verilen pattern ve return option
parametrelerini değerlendirerek eşleşen dizinin başlangıç ya da bitiş konum indexini
döndürür. Herhangi bir eşleşme bulunamazsa 0 değeri döner.
Örneğin, aradığımız veri setinde ilk sayının görüldüğü indexi tespit etmeye çalışalım.
SELECT
REGEXP_INSTR('Volkan Çamaş Regexp 25062017', '[[:digit:]]', 1, 1) as RES
FROM DUAL
Result : 21
Bunu regex fonksiyonu kullanmadan yaptığımızı düşünürsek , tek tek tüm rakamların
pozisyonunu tespit edip sonra bunlar arasında minimum değeri hangisi ise bunu
seçen bir sorgu yazmalıydık!
14. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Oracle Regular Expression Fonksiyonları
REGEXP_INSTR kullanmadan aynı değeri bulmak için böyle bir sorgu oluşturmalıydık.
Result :21
SELECT MIN(NULLIF(IND_VALUE , 0 ) ) as MIN_IND
FROM (
SELECT '0' as DIGIT, INSTR('Volkan Çamaş Regexp 25062017' , 0 ) as IND_VALUE FROM DUAL
UNION ALL
SELECT '1' as DIGIT, INSTR('Volkan Çamaş Regexp 25062017', 1 ) as IND_VALUE FROM DUAL
UNION ALL
SELECT '2' as DIGIT, INSTR('Volkan Çamaş Regexp 25062017' , 2 ) as IND_VALUE FROM DUAL
UNION ALL
SELECT '3' as DIGIT, INSTR('Volkan Çamaş Regexp 25062017' , 3 ) as IND_VALUE FROM DUAL
UNION ALL
SELECT '4' as DIGIT, INSTR('Volkan Çamaş Regexp 25062017' , 4 ) as IND_VALUE FROM DUAL
UNION ALL
SELECT '5' as DIGIT, INSTR('Volkan Çamaş Regexp 25062017' , 5 ) as IND_VALUE FROM DUAL
UNION ALL
SELECT '6' as DIGIT, INSTR('Volkan Çamaş Regexp 25062017' , 6 ) as IND_VALUE FROM DUAL
UNION ALL
SELECT '7' as DIGIT, INSTR('Volkan Çamaş Regexp 25062017' , 7 ) as IND_VALUE FROM DUAL
UNION ALL
SELECT '8' as DIGIT, INSTR('Volkan Çamaş Regexp 25062017' , 8 ) as IND_VALUE FROM DUAL
UNION ALL
SELECT '9' as DIGIT, INSTR('Volkan Çamaş Regexp 25062017' , 9 ) as IND_VALUE FROM DUAL
) t
15. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Oracle Regular Expression Fonksiyonları
REGEXP_SUBSTR
REGEXP_SUBSTR(source_string, regexp_pattern, [position], [occurrence], [modes])
Bir başka fonksiyon olan SUBSTR fonksiyonun genişletilmiş halidir diyebiliriz. SUBSTR
fonksiyonu verilen indexler aralığına denk gelen veriyi döndürürken REGEXP_SUBSTR
verilen pattern doğrultusunda konumu farketmeksizin eşleşen değeri döndürür.
SELECT
REGEXP_SUBSTR('Oracle Regular Expression Demo','[[:alpha:]]+',1,1) FROM dual
Result :
Oracle
Patterni incelediğimizde alpha karakter sınıfı
yani sadece harfler ve ‘+’ belirtilerek ilk
eşleşmenin yakalanması sağlanmıştır.
Boşluk bir harf olarak değerlendirilmediği için
sonuç Oracle dönecektir.
16. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Oracle Regular Expression Fonksiyonları
REGEXP_COUNT
REGEXP_COUNT( source_string, regexp_pattern , [start_position] , [modes] )
Belirttiğimiz patterne uygun kaç adet eşleşme olduğu bilgisini dönen bir fonksiyondur.
Eğer eşleşme bulunamadıysa 0 değerini döndürür.
Örnek olarak ilgili veri setinde kaç adet rakam olduğunu bulalım.
SELECT
REGEXP_COUNT('01072017 tarihinde 008GHXJ78 nolu
referans nolu biletiniz başarıyla satın alındı', '[[:digit:]]', 1) as RES
FROM DUAL
Result:
13
Patterni incelediğimizde digit karakter sınıfı yani
sadece rakamlar ile bir eşleşme olması gerektiği
belirtilmiştir.
17. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Örnekler
Örnekler ile birlikte farklı RegEx patternleri nasıl oluşturabiliriz , hangi ihtiyaçlarımızda
RegEx problemimize çözüm bulacaktır inceleyelim.
18. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Örnekler -1
Bir EFT hareket tablosundaki IBAN’ı aramak istediğimizde IBAN = ‘TR64….’ gibi
filtreleyerek bulabiliriz.
Ancak EFT tablosunda IBAN bilgisini bir IBAN kolonunda değil de açıklama sütunun
içinde herhangi bir yerde tutulduğunu varsayarsak bunu RegEx ile nasıl bulabiliriz
inceleyelim.
Örnek Veri :
‘Volkan Çamaş
Lösev Bağış
İstanbul Merkez Şube TR-1100/451234645
TR640546450000011226027878’
Yukarıda örneğimize uygun bir veri oluşturalım. Aradığımız verinin aslında desenini
(pattern) biliyoruz. 2 adet harf ve 24 adet rakamdan oluşan bir bilgiyi arıyoruz.
Burada yardımımıza regular expression koşuyor ve normal fonksiyonlarla bir hayli
uğraşacağımız bir sorguyu birkaç dakikada oluşturabiliyoruz.
19. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Örnekler -1
Yukarıda önce dual ile örnek verimizi oluşturduk. Sonrasında REGEXP_SUBSTR
fonksiyonu kullanarak verinin içerisinde geçen IBAN bilgisini döndüren bir sorgu
oluşturduk.
Patternimiz ise şöyle ;
[A-Z]{2} İlk 2 karakteri A’dan Z’ye kadar bir harf olmalı
[0-9]{24} Sonrasında da 24 adet rakamdan oluşan bir dizi olmalı
SELECT
regexp_substr(trim(test_data) , '[A-Z]{2}[0-9]{24}' ) as IBAN
FROM
(
select
'Volkan Çamaş
Lösev Bağış
İstanbul Merkez Şube TR-1100/451234545
TR640546450000011226027878
' as test_data FROM
dual
)a
20. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Örnekler -2
Bu örneğimizde içerisinde bir çok veri deseni barındıran bir kolon içerisinden gerekli
olan bilgileri anlamlı kolonlara dönüştürmeyi inceleyeceğiz.
Kolon içerisindeki veri
'26487987451 ; volkan.camas@caligo.com.tr ; 34CLG034 ; 4503458745121245
;TR640546450000011226027878'
Örneğimiz içerisinde sırasıyla bir TCKN (11 haneli sayı) , e-posta adresi , plaka , web
sitesi , kredi kartı numarası ve IBAN patterni (2 harf-24 rakam) bulunduğunu biliyoruz.
Bu örnek için klasik yöntemle yapmaya çalışırsak ‘;’ karakteri ile d parçalama işlemini
yapabiliriz. Ama bu yöntemle validasyon yapmadan içerisinde hangi bilgi olursa olsun
gelecektir.
21. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Örnekler -2
Farklı veri desenlerine uygun patternleri oluşturduk. Böylece bu patterne uymayan
bir bilgi gelmesi durumunda boş gelecektir. Örneğin 9 haneli bir TCKN bilgisi girildi
ise patterne uymadığı için boş dönecektir.
select
regexp_substr(test_data , '[0-9]{11}' ) as tckn,
regexp_substr(test_data , '[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}') as email,
regexp_substr(test_data ,
'[[:alpha:][:digit:][:punct:]]+@[[:alpha:][:digit:][:punct:]]+.[[:alpha:]]{2,4}' ) as email2,
regexp_substr(test_data , '[0-9]{2}[[:alpha:]]{2,3}[0-9]{2,4}' ) as plaka,
regexp_substr(test_data , '[[:digit:]]{16} ') as kredi_kart_no,
regexp_substr(test_data , '[A-Z]{2}[0-9]{24}' ) as IBAN
from (
select
'26487987451 ; volkan.camas@caligo.com.tr ; 34CLG034 ; 4503458745121245
;TR640546450000011226027878' as test_data
from dual
) t
22. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Örnekler -3
Veri ambarı uygulamaları için veri kalitesi kuralları uygularken de RegEx kullanabiliriz.
Ayrıca bu RegEx kurallarını constraint olarak kolonlara tanımlayabilirsiniz.
Örneğin ;
Müşteri adı içerisinde harf içermeyen kaç adet kayıt var ? (Boşluk içerebilir)
SELECT COUNT(*) FROM (
SELECT 'Volkan Çamaş' AS CUSTOMER_NAME FROM DUAL
UNION ALL
SELECT 'Mr. Smith' AS CUSTOMER_NAME FROM DUAL
UNION ALL
SELECT 'Ali Yılmaz' AS CUSTOMER_NAME FROM DUAL
UNION ALL
SELECT 'Ayşe-Mehmet Yıldırım' AS CUSTOMER_NAME FROM DUAL
)
WHERE
(CASE WHEN REGEXP_LIKE(CUSTOMER_NAME , '[[:digit:][:punct:][:cntrl:]]') THEN 1 ELSE 0 END ) = 1
Result:
2
(‘.’ Ve ‘-’ içeren kayıtların sayısı)
23. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
E-mail : volkan.camas@caligo.com.tr
24. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Referanslar
1- http://docs.oracle.com/cd/B28359_01/appdev.111/b28424/adfns_regexp.htm#i1007670
2- http://psoug.org/reference/regexp.html
25. SLAYT BAŞLIĞI BU BÖLÜME EKLENECEK
COPYRIGHT @ 2017 CALIGO DATA MANAGEMENT CONSULTANCY
Teşekkürler