Oracle 10g VBİS-də regular expression-lərin istifadəsi

Posted on 15 Yanvar 2010. Filed under: Oracle | Etiketlər: , , |

Oracle logo

Regular expression nədir?

Düzgün ifadələr(regular expression) dəstəyi Oracle verilənlər bazasına 10g versiyasından etibarən əlavə edilmişdir. Düzgün ifadələr mətn tipli informasiya içərisindən meta simvolların köməyi ilə istənilən informasiyanın tapılmasına və çıxarılmasına imkan verir. Oracle VBİS-də realizasiya edilmiş regular expression-lar POSIX Extended Regular Expression (ERE) standartına uyğundur.

Meta simvollar aşağıdakı cədvəldə verilmişdir.

Meta simvol İzahat
\ İstifadə olunduğu yerdən asılı olaraq 4 cür istifadə oluna bilər:

  • ‘\’ simvolunu göstərir
  • növbəti simvolu göstərir
  • operator təyin edir
  • heç bir iş görmür
* 0 və ya daha çox simvola uyğun gəlir.
+ 1 və ya daha çox simvola uyğun gəlir.
? 0 və ya 1 simvola uyğun gəlir.
| Alternativ simvolları ayırıcı operator kimi istifadə olunur.
^ Sözün əvvəlinə uyğun gəlir. Axtarılan ifadə sözün əvvəlində olmalıdır.
$ Sözün sonuna uyğun gəlir. Axtarılan ifadə sözün sonunda olmalıdır.
. İstənilən simvola uyğun gəlir (NULL-dan başqa)
[] Axtarılan ifadə dəqiq olaraq kvadrat mötərizələr içərisində verilmiş  ifadələrdən birinə uyğun  gəlməlidir. Bunun tərsini etmək üçün isə [^] yazmaq lazımdır, bu halda axtarilan ifadə kvadrat mötərizələr içərisində verilmiş  ifadələrdən başqa istənilən ifadəyə uyğun  gələ bilər.
() Qruplaşdırılmış ifadə
{m} Axtarılan ifadə dəqiq olaraq m dəfə təkrar olunmalıdır.
{m,} Axtarılan ifadə ən az m dəfə təkrar olunmalıdır, daha çox ola bilər.
{m,n} Axtarılan ifadə ən az m dəfə, ən çox isə n dəfə təkrar oluna bilər.
\n Burada n 1-9 rəqəmlərindən biri olmalıdır. Bundan əvvəl n-ci ifadəyə referansdır.
[..] Başqa dillərə məxsus kodlaşdırma sistemində birdən çox simvola uyğun gələr bilər. Məsələn ispan dilində [.ch.].
[::] Axtarış üçün istifadə olunacaq simvollar qrupunu bildirir.

[:alpha:] ancaq hərflər

[:alnum:] ancaq hərflər və rəqəmlər (alphanumeric)

[:digit:] ancaq rəqəmlər

[:lower:] ancaq kiçik hərflər

[:upper:] ancaq böyük hərflər

[:space:] boşluq simvolu, \n, \r və tab simvolu

[:punct:] ancaq . , ! ? kimi durğu işarələri

[:cntrl:] control simvolları (çap olunmayan simvollar)

[:print:] ancaq çap oluna bilən bütün işarələr

[==] Ekvivalent simvolları da axtarışa daxil edir. Məsələn, [=a=] ifadəsi ‘a’ hərfi və onun müxtəlif ekvivalentlərini də axtarışda nəzərə alır(xarici dillər üçün)
\d rəqəm olan simvola uyğun gəlir. (0-9)
\D Rəqəm olmayan simvola uyğun gəlir (0-9-dan başqa istənilən simvol)
\w Sözə uyğun gəlir.
\W Söz olmayan ifadələrə uyğun gəlir.
\s Boşluq simvolu.
\S Boşluq olmayan simvol.
\A Ancaq sözün əvvəlinə uyğun gəlir. Axtarılan ifadə sözün əvvəlində olmalıdır.
\Z Ancaq sözün sonuna uyğun gəlir. Axtarılan ifadə sözün sonunda olmalıdır.
*? Əvvəlki axtarış elementini 0 və ya daha çox dəfə təkrarlayır.
+? Əvvəlki axtarış elementini 1 və ya daha çox dəfə təkrarlayır.
?? Əvvəlki axtarış elementini 0 və ya 1 dəfə təkrarlayır.

Regular expression nələrdə tətbiq oluna bilər?

Bu ifadələr aşağıdakı hallar effektiv şəkildə tətbiq oluna bilər:

1.Mətn tipli informasiyanın düzgünlüyünün yoxlanılması (elektron poçt, mobil telefon nömrəsi, İP adresi, tarix və s.)

2.Mətndə təkrarlanan sözlərin tapılması

3.Lazımsız boşluq simvollarının tapılması və s.

Oracle 10g VBİS-də regular expressionlar aşağıdakı 1 operator və 3 funksiya içərisində istifadə olunur:

  1. REGEXP_LİKE
  2. REGEXP_İNSTR
  3. REGEXP_SUBSTR
  4. REGEXP_REPLACE

Bu funksiyalar həm SQL sorğularında, həm də PL/SQL proqramlarında istifadə oluna bilər.

REGEXP_LİKE operatoru. Oracle LİKE operatoru kimi SQL sorğularının şərt hissəsində (where) istifadə olunur, lakin axtarış imkanları LİKE operatoruna nəzərən daha genişdir. Formatı aşağıdakı kimidir

REGEXP_LIKE(source_string, pattern[, match_parameter])

Aşağıda bu operatorun istifadəsinə aid bir neçə nümunə verilmişdir.

1. Xəbərlər cədvəlindən içərisində kökü ‘göstərmək’ olan müxtəlif sözlər keçən xəbərləri tapmaq üçün aşağıdakı kimi bir SQL sorğusu istifadə oluna bilər.

select xeber_metni from xeberler

where REGEXP_LIKE(xeber_metni, ‘göstər(mək)? | (di)|(ilib)|(ilmişdir)|(diniz)’)

Bu sorğu mətn içərisində ‘göstər’, ‘göstərmək’, ‘göstərdi’, ‘göstərilmişdir’, ‘göstərilib’, ‘göstərdiniz’ sözləri keçən xəbərləri tapır.

2. İşçi cədvəlində mobil_tel sütununa constraint qoymaq lazımdır ki, ancaq (xxx) xxx-xx-xx formatında olan nömrələri qəbul etsin. Bunun üçün aşağıdakı DDL sorğusunu yazmaq lazımdır.

create table isciler

(

id  primary key,

ad varchar2(30) not null,

soyad varchar2(30) not null,

mobil_tel varchar2(15) constraint  mobil_tel__format

check ( REGEXP_LIKE ( mobil_tel, ‘^\(\d{3}\) \d{3}-\d{2}-\d{2}$’) )

);

Burada ‘^\(\d{3}\) \d{3}-\d{2}-\d{2}$’) ifadəsində uyğun olaraq (\d{3}\) (xxx), \d{3}-\d{2}-\d{2} isə xxx-xx-xx formatına qarşılıq gəlir.

REGEXP_İNSTR funksiyası Oracle İNSTR funksiyası kimi mətn içərisində verilmiş ifadəni axtarır, tapsa onun olduğu indeksi verir, lakin İNSTR funksiyasından fərqli olaraq REGEXP_İNSTR tərsinə axtarış imkanına malik deyil.

Formatı aşağıdakı kimidir:

REGEXP_INSTR(source_string, pattern [, start_position
[, occurrence [, return_option [, match_parameter]]]])

Aşağıda bu funksiyanın istifadəsinə aid bir nümunə verilmişdir.

Verilmiş ‘Baki, Ziya Bunyadov, ev 19, menzil 84, AZ 1142′ ifadəsində sondakı 4 rəqəmli zip kodunu çıxarmaq üçün aşağıdakı kimi bir SQL sorğusu yazmaq olar.

select REGEXP_INSTR(Baki, Ziya Bunyadov, ev 19, menzil 84, AZ 1142, ‘[[:digit:]]{4}$’) test from dual

Bu ifadədə [[:digit:]] ancaq rəqəmlər, {4} dəfə təkrarlanan, $ isə ifadənin sonunda yer alan deməkdir.

2. Elektron poçtun doğruluğunu yoxlamaq üçün onun xxx@xxx.xxx formatında olduğunu müyyənləşdirmək lazımdır. REGEX_İNSTR funksiyasının köməyi ilə aşağıdakı kimi bir ifadə yazmaq olar.

REGEXP_INSTR(email, ‘\w+@\w+(\.\w+)+’) > 0

REGEXP_SUBSTR funksiyası SUBSTR funksiyasına bənzər olaraq verilmiş mətn içərisindən onun bir hissəsini çıxarır.

Formatı aşağıdakı kimidir:

REGEXP_SUBSTR(source_string, pattern[, position [, occurrence [, match_parameter]]])

Aşağıda bu funksiyanın istifadəsinə aid bir nümunə verilmişdir.

Verilmiş mətndən iki vergül arasında olan ifadələri aşağıdakı kimi çıxarmaq olar:

select REGEXP_SUBSTR(‘BDU, Qafqaz, Xezer’,
‘, [^,]*,’) as test   FROM dual

Cavab: “, Qafqaz,”

Açıqlama: ‘, [^,]*,’ vergül daha sonra bir boşluq, vergül olmayan istənilən sayda simvol  ([^,]*) və ondan sonra vergül.

REGEXP_REPLACE funksiyası REPLACE funksiyasına bənzər şəkildə verilmiş mətn içərisində axtarış şərtinə uyğun gələn ifadəni verilmiş ifadə ilə əvəz edir.

Formatı aşağıdakı kimidir:

REGEXP_REPLACE(source_string, pattern [, replace_string [, position
[,occurrence, [match_parameter]]]])

Aşağıda bu funksiyanın istifadəsinə aid bir nümunə verilmişdir.

Verilmiş ifadədə mövcud olan artıq boşluqları təmizləmək üçün aşağıdakı kimi bir SQL sorğusu yazmaq mümkündür.

select REGEXP_REPLACE(‘Ramin    Orucov’, ‘( ){2,}’, ‘ ’) as test from dual

Cavab: Ramin Orucov

Bu məsələdə 2 və daha artıq boşluqları ( ){2,} ifadəsi ilə tapıb tək boşluq ‘ ’ simvolu ilə əvəz edirik. ( ){2,} ifadəsində ( ) boşluqları qrup şəklində nəzərdə tutur.

Qaynaqlar

  1. Oracle Database Application Developer’s Guide – Fundamentals, 10g Release 2 (10.2) Part Number B14251-01, http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm
  2. Oracle Database SQL Reference 10g Release 2 (10.2) Part Number B14200-02, http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/ap_posix001.htm
  3. Oracle Magazine September/October 2003, http://www.oracle.com/technology/oramag/oracle/03-sep/o53sql.html
  4. Writing Better SQL Using Regular Expressions, http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html
Advertisements
Tam Yazını Oxu | Make a Comment ( 9 so far )

    Haqqında

    Java ilə obyekt yönlü proqramlaşdırma, Java web proqramlaşdırma, Oracle SQL, PL/SQL proqramlaşdırma, optimallaşdırma

    RSS

    Subscribe Via RSS

    • Subscribe with Bloglines
    • Add your feed to Newsburst from CNET News.com
    • Subscribe in Google Reader
    • Add to My Yahoo!
    • Subscribe in NewsGator Online
    • The latest comments to all posts in RSS

    Meta

Liked it here?
Why not try sites on the blogroll...