בגרסת 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 >>

נכתב ע"י רם קדם