בגרסת 11g נוספו מספר שיפורים מעניינים לביטויים הרגולריים – פונקציה חדשה בשם regexp_countופרמטר חדש לשתי פונקציות קיימות.
REGEXP_COUNT
באמצעות פונקציה זו ניתן לספור מופעים של ביטוי מסויים בתוך טקסט, פעולה מאוד שימושית במקרים מסויימים. לדוגמא, נייצר טבלת לקוחות ונאכלס אותה באמצעות הסינטקס הבא :
RAM >> CREATE TABLE customers 2 (id number, 3 name varchar2(10), 4 cell_phone varchar2(14)) ; Table created. RAM >> INSERT INTO customers 2 VALUES (1, 'Moshe' , '972-52-4342245') ; 1 row created. RAM >> INSERT INTO customers 2 VALUES (2, 'Yossi' , '972-54-3345225') ; 1 row created. RAM >> INSERT INTO customers 2 VALUES (3, 'David' , '972-50-2145225') ; 1 row created. RAM >> INSERT INTO customers 2 VALUES (4, 'Haim' , '972.50.2145925') ; 1 row created. RAM >> COMMIT ; Commit complete. RAM >> SELECT * FROM customers ; ID NAME CELL_PHONE ---------- ---------- -------------- 1 Moshe 972-52-4342245 2 Yossi 972-54-3345225 3 David 972-50-2145225 4 Haim 972.50.2145925
ונציג את מספר הפעמים בו התו '-' מופיע במספר הטלפון
RAM >> SELECT id, 2 name , 3 cell_phone, 4 REGEXP_COUNT( cell_phone, -- source_char 5 '-' -- pattern 6 ) AS COL_1 7 FROM customers ; ID NAME CELL_PHONE COL_1 ---------- ---------- -------------- ---------- 1 Moshe 972-52-4342245 2 2 Yossi 972-54-3345225 2 3 David 972-50-2145225 2 4 Haim 972.50.2145925 0
ניתן לבצע את הספירה החל מנקודה מסויימת, בדוגמא הבאה אנו בודקים את מספר הפעמים שהספרה '3' מופיעה במספר הטלפון החל מהתו השביעי.
RAM >> SELECT id, 2 name , 3 cell_phone, 4 REGEXP_COUNT( cell_phone, -- source_char 5 '3' , -- pattern 6 7 -- position 7 ) AS COL_1 8 FROM customers ; ID NAME CELL_PHONE COL_1 ---------- ---------- -------------- ---------- 1 Moshe 972-52-4342245 1 2 Yossi 972-54-3345225 2 3 David 972-50-2145225 0 4 Haim 972.50.2145925 0
REGEXP_SUBSTR – SUBEXPR parameter
גרסת 11g מאפשרת שימוש בפרמטר חדש בתוך פונקציית regexp_substr. פרמטר זה מאפשר לבטא תת ביטוי מתוך ביטוי רגולרי שלם.
לדוגמא אם ניקח את הביטוי הבא – '(972)(-)(5[240])(-)([0-9]{7})', אשר מהווה תבנית למספרי טלפון, ניתן יהיה לאמר כי הוא מורכב מ 5 תתי ביטויים שונים:
'(972)(-)(5[240])(-)([0-9]{7})'
בדוגמא הבאה נשתמש בפרמטר זה כדי להחזיר רק את תת הביטוי הראשון :
RAM >> SELECT id, 2 name , 3 cell_phone, 4 REGEXP_SUBSTR( cell_phone, -- source_char 5 '(972)(-)(5[240])(-)([0-9]{7})' , -- pattern 6 1 , -- position 7 1, -- occurrence 8 'i', -- parameter 9 1 -- new to 11g : subexpression 10 ) AS COL_1 11 from customers ; ID NAME CELL_PHONE COL_1 ---------- ---------- -------------- -------------- 1 Moshe 972-52-4342245 972 2 Yossi 972-54-3345225 972 3 David 972-50-2145225 972 4 Haim 972.50.2145925
ובדוגמא זו נשתמש בפרמטר כדי להחזיר את כל אחד מחמשת תתי הביטויים השונים :
RAM >> SELECT id, 2 name , 3 cell_phone, 4 REGEXP_SUBSTR( cell_phone, -- source_char 5 '(972)(-)(5[240])(-)([0-9]{7})' , -- pattern 6 1 , -- position 7 1, -- occurrence 8 'i', -- parameter 9 1 -- new to 11g : subexpression 10 ) AS PART_1, 11 REGEXP_SUBSTR( cell_phone, -- source_char 12 '(972)(-)(5[240])(-)([0-9]{7})' , -- pattern 13 1 , -- position 14 1, -- occurrence 15 'i', -- parameter 16 2 -- new to 11g : subexpression 17 ) AS PART_2, 18 REGEXP_SUBSTR( cell_phone, -- source_char 19 '(972)(-)(5[240])(-)([0-9]{7})' , -- pattern 20 1 , -- position 21 1, -- occurrence 22 'i', -- parameter 23 3 -- new to 11g : subexpression 24 ) AS PART_3, 25 REGEXP_SUBSTR( cell_phone, -- source_char 26 '(972)(-)(5[240])(-)([0-9]{7})' , -- pattern 27 1 , -- position 28 1, -- occurrence 29 'i', -- parameter 30 4 -- new to 11g : subexpression 31 ) AS PART_4, 32 REGEXP_SUBSTR( cell_phone, -- source_char 33 '(972)(-)(5[240])(-)([0-9]{7})' , -- pattern 34 1 , -- position 35 1, -- occurrence 36 'i', -- parameter 37 5 -- new to 11g : subexpression 38 ) AS PART_5 39 FROM customers ; ID NAME CELL_PHONE PART_1 PART_2 PART_3 PART_4 PART_5 ---------- ---------- -------------- ------- ------- ------- ------- ------- 1 Moshe 972-52-4342245 972 - 52 - 4342245 2 Yossi 972-54-3345225 972 - 54 - 3345225 3 David 972-50-2145225 972 - 50 - 2145225 4 Haim 972.50.2145925
REGEXP_INSTR – SUBEXPR parameter
בדומה ל regexp_substr, גם לפונקציית regexp_instr התווסף פרמטר חדש אשר מאפשר לבטא תת ביטוי מתוך ביטוי רגולרי שלם.
על מנת להמחיש כיצד פונקציה זו עובדת נייצר טבלה ונאכלס אותה לפי הסינטקס הבא :
RAM >> DROP TABLE customers ; Table dropped. RAM >> CREATE TABLE customers 2 (id number, 3 name varchar2(10), 4 email varchar2(25)) ; Table created. RAM >> INSERT INTO customers 2 VALUES (1 ,'Ram' ,'ram@gmail.com') ; 1 row created. RAM >> INSERT INTO customers 2 VALUES (2 ,'haim' ,'haim@gmail.com') ; 1 row created. RAM >> INSERT INTO customers 2 VALUES (3 ,'moshe' ,'moshe@gmail.com') ; 1 row created. RAM >> INSERT INTO customers 2 VALUES (4 ,'avi' ,'ben@gmail.com') ; 1 row created. RAM >> INSERT INTO customers 2 VALUES (5 ,'daniel' ,'daniel@gmail.com') ; 1 row created. RAM >> COMMIT ; Commit complete. RAM >> SELECT * FROM customers ; ID NAME EMAIL ---------- ---------- ------------------------- 1 Ram ram@gmail.com 2 haim haim@gmail.com 3 moshe moshe@gmail.com 4 avi ben@gmail.com 5 daniel daniel@gmail.com
אם נרצה לבטא את כתובת המייל של כל אחד מהלקוחות נוכל להשתמש בתבנית הבסיסית הבאה – '([a-z]+)(@)([a-z]+)(.)([a-z]+)', תבנית זו מורכבת מ 5 תתי ביטויים שונים:
'([a-z]+)(@)([a-z]+)(.)([a-z]+)'
בדוגמא הבאה נשתמש בפרמטר זה כדי להחזיר את מיקום תחילת תת הביטוי הראשון :
RAM >> SELECT id, 2 name , 3 email , 4 regexp_instr( email, -- source_char 5 '([a-z]+)(@)([a-z]+)(.)([a-z]+)' , -- pattern 6 1 , -- position 7 1, -- occurrence 8 0, -- return_option 9 'i', -- match_parameter 10 1 -- new to 11g : subexpression 11 ) AS COL_1 12 FROM customers ; ID NAME EMAIL COL_1 ---------- ---------- ------------------------- ---------- 1 Ram ram@gmail.com 1 2 haim haim@gmail.com 1 3 moshe moshe@gmail.com 1 4 avi ben@gmail.com 1 5 daniel daniel@gmail.com 1
ובדוגמא זו נציג את מיקום תחילת כל אחד מחמשת החלקים השונים של הביטוי
RAM >> SELECT id, 2 name , 3 email , 4 regexp_instr( email, -- source_char 5 '([a-z]+)(@)([a-z]+)(.)([a-z]+)' , -- pattern 6 1 , -- position 7 1, -- occurrence 8 0, -- return_option 9 'i', -- match_parameter 10 1 -- new to 11g : subexpression 11 ) AS PART_1, 12 regexp_instr( email, -- source_char 13 '([a-z]+)(@)([a-z]+)(.)([a-z]+)' , -- pattern 14 1 , -- position 15 1, -- occurrence 16 0, -- return_option 17 'i', -- match_parameter 18 2 -- new to 11g : subexpression 19 ) AS PART_2, 20 regexp_instr( email, -- source_char 21 '([a-z]+)(@)([a-z]+)(.)([a-z]+)' , -- pattern 22 1 , -- position 23 1, -- occurrence 24 0, -- return_option 25 'i', -- match_parameter 26 3 -- new to 11g : subexpression 27 ) AS PART_3, 28 regexp_instr( email, -- source_char 29 '([a-z]+)(@)([a-z]+)(.)([a-z]+)' , -- pattern 30 1 , -- position 31 1, -- occurrence 32 0, -- return_option 33 'i', -- match_parameter 34 4 -- new to 11g : subexpression 35 ) AS PART_4, 36 regexp_instr( email, -- source_char 37 '([a-z]+)(@)([a-z]+)(.)([a-z]+)' , -- pattern 38 1 , -- position 39 1, -- occurrence 40 0, -- return_option 41 'i', -- match_parameter 42 5 -- new to 11g : subexpression 43 ) AS PART_5 44 FROM customers ; ID NAME EMAIL PART_1 PART_2 PART_3 PART_4 PART_5 ---------- ---------- ------------------------- ------ ------ ------ ------ ------ 1 Ram ram@gmail.com 1 4 5 10 11 2 haim haim@gmail.com 1 5 6 11 12 3 moshe moshe@gmail.com 1 6 7 12 13 4 avi ben@gmail.com 1 4 5 10 11 5 daniel daniel@gmail.com 1 7 8 13 14 RAM >>
נכתב ע"י רם קדם