החל מגרסת 10g אורקל החלה לתמוך בביטויים רגולריים באמצעות הפונקציות: regexp_instr, regexp_substr, regexp_like, regexp_replace, אותן ניתן ליישם כחלק מקוד ה SQL וה PLSQL.

כפי שנראה בדוגמאות הבאות, פונקציות אלו מאפשרות ביטוי נח ופשוט של תבניות טקסט (Patterns), ויוצרות יריעה עצומה של יכולות בעבודה מול ביטויים מחרוזתיים.

בפוסט זה נתמקד בפונקצית regexp_like.

REGEXP_LIKE

פונקציה זו עובדת בדומה לאופרטור ה LIKE חיפוש על פי תבניות.  השוני מתבטא בכך שפונקציית ה REGEXP_LIKE עובדת עם ביטויים מורכבים בעוד LIKE מול תבניות פשוטות.

נייצר טבלה המורכבת ממחרוזות שונות לפי הסינטקס הבא –

RAM > CREATE TABLE names

  2  AS

  3  SELECT last_name AS NAME

  4  FROM hr.employees

  5  ORDER BY salary ;

Table created.


ונתחיל בהדגמא פשוטה – הצגת כל העובדים אשר קיים בשמם התו
'z'

RAM > -- Demo 1

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , 'z') AND rownum <= 10;

NAME

————————-

Lorentz

Gietz

Ozer

Errazuriz

נמשיך ונציג את כל העובדים אשר קיים בשמם רצף התווים 'be'

RAM >

RAM > -- Demo 2

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , 'be') AND rownum <= 10;

NAME

————————-

Abel

Greenberg

כעת נעשה שימוש בתו '|' כדי להציג את כל העובדים אשר קיים בשמם רצף התווים 'be' או 'ae'

RAM > -- Demo 3

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , 'be|ae') AND rownum <= 10;

NAME

————————-

Baer

Abel

Raphaely

Greenberg

ניתן להשתמש בתו 'c' כדי לציין שהחיפוש יהיה Case Sensitive (הדיפולט)

RAM > -- Demo 4

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , 'be|ae' , 'c' ) AND rownum <= 10;

NAME

————————-

Baer

Abel

Raphaely

Greenberg

וניתן להשתמש בתו 'i' כדי לציין שהחיפוש יהיה לא Case Sensitive

RAM > -- Demo 5

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , 'be|ae' , 'i' ) AND rownum <= 10;

NAME

————————-

Bell

Bernstein

Baer

Abel

Raphaely

Greenberg

 

6 rows selected.

 

ניתן להשתמש בתו '^' כדי לציין את תחילת המילה, בדוגמא הבאה נשתמש בו עבור רצף התווים 'be'.

RAM > -- Demo 6

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '^be|ba' , 'i' ) AND rownum <= 10;

NAME

————————-

Baida

Bell

Pataballa

Banda

Bates

Bernstein

Baer

 

7 rows selected.

ניתן להשתמש בו כדי לציין את תחילת המילה עבור הרצף 'be' והרצף 'ba'

RAM > -- Demo 7

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '^be|^ba' , 'i' ) AND rownum <= 10;

NAME

————————-

Baida

Bell

Banda

Bates

Bernstein

Baer

 

6 rows selected.

לסיום – ניתן להשתמש בתו '$' כדי לציין את סיומת המילה. בדוגמא זו אנו מציגים את העובדים אשר שמם מסתיים ברצף 'es' או ברצף 'er'

RAM > -- Demo 8

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , 'es$|er$' , 'i' ) AND rownum <= 10;

NAME

————————-

Philtanker

Colmenares

Jones

Gates

Davies

Nayer

Stiles

Dellinger

Bates

Baer

 

10 rows selected.

כעת נעבור לצמד תווים נוסף המשמש אותנו בביטויים הרגולריים – [ ].
בדוגמא הבאה נציג את כל העובדים אשר בשמם קיימים התווים
'j' או 'z'

RAM > -- Demo 1

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[jz]') AND rownum <= 10;

NAME

————————-

Rajs

Lorentz

Gietz

Ozer

Errazuriz

וכעת נציג את כל העובדים אשר בשמם קיימים התווים 'b' או 'z' או 'E' (זכרו – הדיפולט הוא Case Sensitive)

RAM > -- Demo 2

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[bzE]') AND rownum <= 10;

NAME

————————-

Tobias

Cabrio

Everett

Lorentz

Pataballa

Ernst

Cambrault

Gietz

McEwen

Cambrault

נריץ שוב את אותה שאילתה, הפעם נציין כי החיפוש לא יהיה Case Sensitive

RAM > -- Demo 3

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[bzE]' , 'i') AND rownum <= 10;

NAME

————————-

Philtanker

Markle

Gee

Perkins

Colmenares

Patel

OConnell

Mikkilineni

Seo

Tobias

 

10 rows selected.

דוגמא נוספת – כל העובדים אשר האותיות 'a', 'b' או 'c' קיימות בשמם

RAM > -- Demo 4

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[abc]') AND rownum <= 10;

NAME

————————-

Philtanker

Markle

Landry

Colmenares

Patel

Vargas

Sullivan

Marlow

Grant

Matos

 

10 rows selected.

לסיום, במקום לכתוב את הערכים 'a','b','c' ניתן לציין אותם כטווח ('a'-'c')

RAM > -- Demo 5

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[a-c]') AND rownum <= 10;

NAME

————————-

Philtanker

Markle

Landry

Colmenares

Patel

Vargas

Sullivan

Marlow

Grant

Matos

 

10 rows selected.

 

נמשיך ונציג את כל העובדים אשר בשמם קיים אחד התווים בטווח d-g ולאחריו מופיע התו 'a'

RAM > -- Demo 1

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[d-g]a') AND rownum <= 10;

NAME

————————-

Vargas

Baida

Fleaur

Banda

נציג את כל העובדים אשר בשמם קיים אחד התווים בטווח d-g, לאחריו מופיע רווח, ולאחריו התו 'H'

RAM > -- Demo 2

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[d-g] H') AND rownum <= 10;

NAME

————————-

De Haan

נוכל להשתמש בתו '.' כדי לייצג תו כלשהו, בדוגמא הבאה אנו מציגים את כל העובדים אשר בשמם אחד התווים בטווח b-g, לאחריו מופיע תו כלשהו, ולאחריו התו 'a'

RAM > -- Demo 3

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[b-g].[a]') AND rownum <= 10;

NAME

————————-

Colmenares

Tobias

McCain

Sarchand

Sewall

Cambrault

Sciarra

Cambrault

 

8 rows selected.

כמו כן, נוכל להשתמש בתו '.' כדי לייצג יותר מתו אחד, בדוגמא הבאה אנו מציגים את כל העובדים אשר בשמם אחד התווים בטווח b-g, לאחריו מופיעים שני תווים, ולאחר מכן התו 'a'

RAM > -- Demo 4

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[b-g]..[a]') AND rownum <= 10;

NAME

————————-

De Haan

Kochhar  

 

לסיום – ניתן להשתמש בצמד התווים { } כדי לייצג מספר מופעים, לדוגמא – הצגת כל העובדים אשר בשמם קיימים שני תווי 'a' רציפים

RAM > -- Demo 5 

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[a]{2}') AND rownum <= 10;

NAME

————————-

De Haan

דוגמא נוספת – הצגת כל העובדים אשר בשמם קיימים שני תווי 'o' רציפים

RAM > -- Demo 6

RAM > -- Exactly 2 repetitions of the letter o

RAM > SELECT *

  2  FROM names

  3  WHERE regexp_like (name , '[o]{2}') AND rownum <= 10;

NAME

————————-

Khoo

Bloom

כעת נראה מעט עבודה מול מספרים, נייצר טבלה ונכניס אליה רשומות לפי הסינטקס הבא –

RAM > CREATE TABLE text_tab

  2  (text varchar2(15));

Table created.

RAM >

RAM > INSERT INTO text_tab VALUES ('432sometext');

1 row created.

RAM > INSERT INTO text_tab VALUES ('157sometext');

1 row created.

RAM > INSERT INTO text_tab VALUES ('32sometext');

1 row created.

RAM > INSERT INTO text_tab VALUES ('9943sometext');

1 row created.

RAM > INSERT INTO text_tab VALUES ('sometext');

1 row created.

RAM > INSERT INTO text_tab VALUES ('sometext 657');

1 row created.

RAM > INSERT INTO text_tab VALUES ('some 5678text');

1 row created.

RAM > INSERT INTO text_tab VALUES ('sometext 8675');

1 row created.

RAM > INSERT INTO text_tab VALUES ('sometext 5876');

1 row created.

אלו הערכים בטבלה

RAM > SELECT * FROM text_tab ;

TEXT

---------------

432sometext

157sometext

32sometext

9943sometext

sometext

sometext 657

some 5678text

sometext 8675

sometext 5876

9 rows selected.

נציג את כל הערכים בטבלה אשר מכילים את אחת הספרות בטווח של 0-9

RAM > SELECT *

  2  FROM text_tab

  3  WHERE regexp_like (text , '[0-9]') ;

TEXT

—————

432sometext

157sometext

32sometext

9943sometext

sometext 657

some 5678text

sometext 8675

sometext 5876

 

8 rows selected.

נציג את כל הערכים בטבלה אשר מכילים את אחת הספרות בטווח של 5-8

RAM > SELECT *

2 FROM text_tab

3 WHERE regexp_like (text , '[5-8]') ;

TEXT

—————

157sometext

sometext 657

some 5678text

sometext 8675

sometext 5876

נציג את כל הערכים בטבלה אשר מכילים בארבעה מופעים את אחת הספרות בטווח של 5-8, (ספרה ראשונה בין 5-8, ספרה שניה בין 5-8, ספרה שלישית בין 5-8, ספרה רביעית בין 5-8)

RAM > SELECT *

2 FROM text_tab

3 WHERE regexp_like (text , '[5-8]{4}') ;

 

TEXT

—————

some 5678text

sometext 8675

sometext 5876

ולסיום – נציג את כל הערכים בטבלה אשר מכילים בארבעה מופעים את אחת הספרות בטווח של 5-8 ולאחריהם מופיעה אות כלשהי

RAM > SELECT *

2 FROM text_tab

3 WHERE regexp_like (text , '[5-8]{4}[a-z]') ;

TEXT

—————

some 5678text