בגרסת 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 >>
נכתב ע"י רם קדם