Oracle PL/SQL Tutorial/Regular Expressions Functions/REGEXP SUBSTR

Материал из SQL эксперт
Перейти к: навигация, поиск

Backreference

   <source lang="sql">

The backslash may be followed by a number. In the backreference version, "\1" says to match the same string as was matched by the nth subexpression. As a first example, we can use the backreference in a manner similar to the repeat operator.

SQL> SQL> SELECT REGEXP_SUBSTR("Yababa dababa do","(ab)")

 2  FROM dual;

RE -- ab SQL> SQL> SQL> SELECT REGEXP_SUBSTR("Yababa dababa do","(ab)\1")

 2  FROM dual;

REGE


abab SQL> SQL> SQL> SELECT REGEXP_SUBSTR("Yababa dababa do","(ab){2}") from dual; REGE


abab SQL></source>


Grouping

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table myTable(

 2    id           NUMBER(2),
 3    value        VARCHAR(50)
 4  );

Table created. SQL> SQL> insert into myTable(id, value)values(1,"1234 4th St. Vancouver"); 1 row created. SQL> insert into myTable(id, value)values(2,"4 Maple Ct. New York"); 1 row created. SQL> insert into myTable(id, value)values(3,"4321 Green Blvd. London"); 1 row created. SQL> insert into myTable(id, value)values(4,"33 Third St. Toronto"); 1 row created. SQL> insert into myTable(id, value)values(5,"One First Drive. Queen"); 1 row created. SQL> insert into myTable(id, value)values(6,"1664 1/2 Springhill Ave"); 1 row created. SQL> insert into myTable(id, value)values(7,"665 Fall Ave. Linken"); 1 row created. SQL> SQL> select * from mytable;

       ID VALUE

--------------------------------------------------
        1 1234 4th St. Vancouver
        2 4 Maple Ct. New York
        3 4321 Green Blvd. London
        4 33 Third St. Toronto
        5 One First Drive. Queen
        6 1664 1/2 Springhill Ave
        7 665 Fall Ave. Linken

7 rows selected. SQL> SQL> SELECT value, REGEXP_SUBSTR(value,"ird|irs")

 2  FROM myTable;

VALUE REGEXP_SUBSTR(VALUE,"IRD|IRS")


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

- 1234 4th St. Vancouver 4 Maple Ct. New York 4321 Green Blvd. London 33 Third St. Toronto ird One First Drive. Queen irs 1664 1/2 Springhill Ave 665 Fall Ave. Linken 7 rows selected. SQL> SQL> SQL> SQL> SQL> drop table myTable; Table dropped. SQL> SQL></source>


Group the letters "ir" together by putting them in parentheses and then parenthesizing the suffix using alternation

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table myTable(

 2    id           NUMBER(2),
 3    value        VARCHAR(50)
 4  );

Table created. SQL> SQL> insert into myTable(id, value)values(1,"1234 4th St. Vancouver"); 1 row created. SQL> insert into myTable(id, value)values(2,"4 Maple Ct. New York"); 1 row created. SQL> insert into myTable(id, value)values(3,"4321 Green Blvd. London"); 1 row created. SQL> insert into myTable(id, value)values(4,"33 Third St. Toronto"); 1 row created. SQL> insert into myTable(id, value)values(5,"One First Drive. Queen"); 1 row created. SQL> insert into myTable(id, value)values(6,"1664 1/2 Springhill Ave"); 1 row created. SQL> insert into myTable(id, value)values(7,"665 Fall Ave. Linken"); 1 row created. SQL> SQL> select * from mytable;

       ID VALUE

--------------------------------------------------
        1 1234 4th St. Vancouver
        2 4 Maple Ct. New York
        3 4321 Green Blvd. London
        4 33 Third St. Toronto
        5 One First Drive. Queen
        6 1664 1/2 Springhill Ave
        7 665 Fall Ave. Linken

7 rows selected. SQL> SQL> SQL> SELECT value, REGEXP_SUBSTR(value,"(ir)(d|s)")

 2  FROM myTable;

VALUE REGEXP_SUBSTR(VALUE,"(IR)(D|S)")


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

- 1234 4th St. Vancouver 4 Maple Ct. New York 4321 Green Blvd. London 33 Third St. Toronto ird One First Drive. Queen irs 1664 1/2 Springhill Ave 665 Fall Ave. Linken 7 rows selected. SQL> SQL> SQL> SQL> drop table myTable; Table dropped. SQL></source>


Regexp_Substr returns a string of data type VARCHAR2 or CLOB

REGEXP_SUBSTR uses regular expressions to specify the beginning and ending points of the returned string.

The simplest format for this function is:

REGEXP_SUBSTR(source_string, pattern_to_find)

The general format for the REGEXP_SUBSTR function with all the options is:

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



   <source lang="sql">

SQL> SQL> SELECT REGEXP_SUBSTR("Mississippi", "si", 1, 2, "i") FROM dual; RE -- si SQL> SQL></source>


REGEXP_SUBSTR(x, pattern [, start [, occurrence [, match_option]]]) gets a substring of x that matches pattern, which begins at the position specified by start.

The following example returns the substring that matches the regular expression lalpha: {4} using REGEXP_SUBSTR():



   <source lang="sql">

SQL> SQL> SELECT REGEXP_SUBSTR("abcedfghijklumnoprstuvwxyzabcedfghijklumnoprstuvwxyzabcedfghijklumnoprstuvwxyz", "lalpha:{4}") AS result

 2  FROM dual;

RESUL


lumno SQL> SQL></source>


Search for (

   <source lang="sql">

SQL> SQL> create table history

 2  ( empno      NUMBER(4)
 3  , beginyear  NUMBER(4)
 4  , begindate  DATE
 5  , enddate    DATE
 6  , deptno     NUMBER(2)
 7  , msal       NUMBER(6,2)
 8  , comments   VARCHAR2(60)
 9  ) ;

Table created. SQL> SQL> SQL> SQL> insert into history values (9,2000,date "2000-01-01",date "2002-01-02",40, 950,"history for 9"); 1 row created. SQL> insert into history values (8,2000,date "2000-01-02", NULL ,20, 800,""); 1 row created. SQL> insert into history values (7,1988,date "2000-01-06",date "2002-01-07",30,1000,""); 1 row created. SQL> insert into history values (6,1989,date "2000-01-07",date "2002-01-12",30,1300,""); 1 row created. SQL> insert into history values (5,1993,date "2000-01-12",date "2002-01-10",30,1500,"history for 5"); 1 row created. SQL> insert into history values (4,1995,date "2000-01-10",date "2002-01-11",30,1700,""); 1 row created. SQL> insert into history values (3,1999,date "2000-01-11", NULL ,30,1600,""); 1 row created. SQL> insert into history values (2,1986,date "2000-01-10",date "2002-01-08",20,1000,"history for 2"); 1 row created. SQL> insert into history values (1,1987,date "2000-01-08",date "2002-01-01",30,1000,"history for 1"); 1 row created. SQL> insert into history values (7,1989,date "2000-01-01",date "2002-05-12",30,1150,"history for 7"); 1 row created. SQL> SQL> SQL> SQL> select comments

 2  ,      regexp_substr(comments, "\([^\)]+\)") as substring
 3  from   history
 4  where  comments like "%(%";

no rows selected SQL> SQL> SQL> drop table history; Table dropped.</source>