Oracle PL/SQL Tutorial/Regular Expressions Functions/REGEXP SUBSTR
Содержание
- 1 Backreference
- 2 Grouping
- 3 Group the letters "ir" together by putting them in parentheses and then parenthesizing the suffix using alternation
- 4 Regexp_Substr returns a string of data type VARCHAR2 or CLOB
- 5 REGEXP_SUBSTR(x, pattern [, start [, occurrence [, match_option]]]) gets a substring of x that matches pattern, which begins at the position specified by start.
- 6 Search for (
Backreference
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>
Grouping
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>
Group the letters "ir" together by putting them in parentheses and then parenthesizing the suffix using alternation
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>
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])
SQL>
SQL> SELECT REGEXP_SUBSTR("Mississippi", "si", 1, 2, "i") FROM dual;
RE
--
si
SQL>
SQL>
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():
SQL>
SQL> SELECT REGEXP_SUBSTR("abcedfghijklumnoprstuvwxyzabcedfghijklumnoprstuvwxyzabcedfghijklumnoprstuvwxyz", "l[[:alpha:]]{4}") AS result
2 FROM dual;
RESUL
-----
lumno
SQL>
SQL>
Search for (
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.