Regular Expression (REGEXP) Fonksiyonları – 2

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*** )

  1. 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


 

Bu yazı Pure SQL / PLSQL, sql, İş Zekası içinde yayınlandı ve , , , , , , , , , , , , , , , , , , , , , olarak etiketlendi. Kalıcı bağlantıyı yer imlerinize ekleyin.

2 Responses to Regular Expression (REGEXP) Fonksiyonları – 2

  1. Geri bildirim: Regular Expression (REGEXP) Fonksiyonları | İş Zekası ve Veri Tabanı Yönetimi

  2. Geri bildirim: Yeni dünyalar keşfetmeye devam ediyoruz :) #Bidunyasi.wordpress.com | MyLifeMyPc

Yorum bırakın