Professional Documents
Culture Documents
1.regular Expressions
1.regular Expressions
Introducing
Oracle Regular Expressions
Jonathan Gennick, O'Reilly & Associates
Peter Linsley, Oracle Corporation
What are Regular
Expressions?
A language, or syntax, you can use to describe
patterns in text
Example: [0-9]{3}-[0-9]{4}
That which you can describe, you can find and
manipulate
Unix ed, grep, perl, and now everywhere!
What are Regular
Expressions?
Follow the script for build database and table
– CREATE DATABASE RE
– CREATE TABLE RE (DESCRIPTION VARCHAR2(6)
– INSERT INTO RE VALUES (‘652’),(‘217’),
(‘113');
Why Describe Patterns?
SELECT *
FROM park
WHERE description LIKE '%acre%';
SELECT REGEXP_INSTR(description,
'[0-9]+(-| )acre')
FROM park;
REGEXP_INSTR(DESCRIPTION,'[0-9]+…
---------------------------------
6
20
0
…
REGEXP_SUBSTR
Determine what text matched:
SELECT REGEXP_SUBSTR(description,
'[0-9]+(-| )acre')
FROM park;
REGEXP_SUBSTR(DESCRIPT
----------------------
217-acre
27 acre
…
REGEXP_SUBSTR Cont
To extract just the acreage value:
SELECT REGEXP_SUBSTR(
REGEXP_SUBSTR(description,
'[0-9]+(-| )acre'),'[0-9]+')
FROM park;
REGEXP_SUBSTR(REGEXP
--------------------
217
27
REGEXP_REPLACE
UPDATE park
SET description = REGEXP_REPLACE(
description,'([0-9]+)(-| )acre',
TO_CHAR(0.4047 * TO_NUMBER(
REGEXP_SUBSTR(
REGEXP_SUBSTR(description,
'[0-9]+(-| )acre'),'[0-9]+')))
|| '\2' || 'hectare');
REGEXP_REPLACE Cont.
This 217-acre park is wonderful.
217-acre
UPDATE park
SET description = REGEXP_REPLACE(
description,'([0-9]+)(-| )acre',
TO_CHAR(0.4047 * TO_NUMBER(
REGEXP_SUBSTR(
REGEXP_SUBSTR(description,
'[0-9]+(-| )acre'),'[0-9]+')))
|| '\2' || 'hectare');
REGEXP_REPLACE Cont.
This 217-acre park is wonderful.
217-acre
217
UPDATE park
SET description = REGEXP_REPLACE(
description,'([0-9]+)(-| )acre',
TO_CHAR(0.4047 * TO_NUMBER(
REGEXP_SUBSTR(
REGEXP_SUBSTR(description,
'[0-9]+(-| )acre'),'[0-9]+')))
|| '\2' || 'hectare');
REGEXP_REPLACE Cont.
This 217-acre park is wonderful.
217-acre
217
217 * 0.4047 = 87.8199
UPDATE park
SET description = REGEXP_REPLACE(
description,'([0-9]+)(-| )acre',
TO_CHAR(0.4047 * TO_NUMBER(
REGEXP_SUBSTR(
REGEXP_SUBSTR(description,
'[0-9]+(-| )acre'),'[0-9]+')))
|| '\2' || 'hectare');
REGEXP_REPLACE Cont.
This 217-acre park is wonderful.
217-acre
217
217 * 0.4047 = 87.8199
87.8199\2hectare
UPDATE park
SET description = REGEXP_REPLACE(
description,'([0-9]+)(-| )acre',
TO_CHAR(0.4047 * TO_NUMBER(
REGEXP_SUBSTR(
REGEXP_SUBSTR(description,
'[0-9]+(-| )acre'),'[0-9]+')))
|| '\2' || 'hectare');
REGEXP_REPLACE Cont.
This 217-acre park is wonderful.
217-acre
217
217 * 0.4047 = 87.8199
87.8199\2hectare
87.8199-hectare
1 2
UPDATE park
SET description = REGEXP_REPLACE(
description,'([0-9]+)(-| )acre',
TO_CHAR(0.4047 * TO_NUMBER(
REGEXP_SUBSTR(
REGEXP_SUBSTR(description,
'[0-9]+(-| )acre'),'[0-9]+')))
|| '\2' || 'hectare');
REGEXP_REPLACE Cont.
This 217-acre park is wonderful.
217-acre
217
217 * 0.4047 = 87.8199
87.8199\2hectare
87.8199-hectare
This 87.8199-hectare park is wonderful.
UPDATE park
SET description = REGEXP_REPLACE(
description,'([0-9]+)(-| )acre',
TO_CHAR(0.4047 * TO_NUMBER(
REGEXP_SUBSTR(
REGEXP_SUBSTR(description,
'[0-9]+(-| )acre'),'[0-9]+')))
|| '\2' || 'hectare');
D E M O N S T R A T I O N
Oracle Regular
Expressions
Performance
SELECT REGEXP_SUBSTR(
'In the beginning','.+[[:space:]]')
FROM dual;
In the
Longest Match vs Greediness
For example:
REGEXP_SUBSTR('description','[^[:space:]]+',1,10)
Match Parameter
Case-insensitive search:
SELECT *
FROM park
WHERE REGEXP_LIKE(
description,
'[0-9]+(-| )acre',
'i');
Newline matching
SELECT *
FROM park
WHERE REGEXP_LIKE(
description,
'[0-9]+.acre',
'in');
String anchors
SELECT * FROM
EMPLOYEE
WHERE REGEXP_LIKE(
Yes!
surname,'^Ellison');
String anchors
SELECT * FROM
EMPLOYEE
WHERE REGEXP_LIKE(
No!
surname,'^Gennick');
String anchors
SELECT * FROM
EMPLOYEE
WHERE REGEXP_LIKE(
Yes!
surname,'^Gennick','m');
Locale Support
NLS_SORT=GERMAN a,b,c…z
[a-z]
NLS_SORT=GERMAN_CI a,A,b,B,c,C…z,Z
Character Classes
caballo
Collation Elements
Chico
Equivalence Classes
Jonathan Gennick
& Peter Linsley