Oracle regular expressions examples (REGEXP)

  • Oracle 10 and above

Примеры использования регулярных выражений.

REGEXP_REPLACE
1. Замена всех пробелов в строке на двойной пробел.

with t(fname) as
(select 'Hello, dear   friend! Nice to  see   you!' from dual)
select regexp_replace(fname, '[ ]+', '  ')  from t;</pre>
<pre>fname
--------------------------------------------------
Hello,  dear  friend!  Nice  to  see  you!

2. Замена первых n-символов в строке на другие.

with t(fname) as
(select 'Regular expressions is very easy' from dual)
select regexp_replace(fname, lpad(fname, 7), 'Arithmetic')  from t;

FNAME                              
-----------------------------------
Arithmetic expressions is very easy

3. Замена n-ого символа(ов) в строке, начиная с позиции k

with t(fname) as
(select 1000340082145076 from dual)
select regexp_replace(fname, '..', '21', 5, 1) fname  from t;

FNAME           
----------------
1000210082145076

4. Получить часть строки после первой запятой

with t(fname) as
(select 'gfdgh  ввап1; 567, 23425' from dual)
select regexp_replace(fname,  '^[^,]*,') fname  from t;

FNAME
------
23425

5. Удаляем из строки html tags

with t(fname) as
(select '<span style="color: rgb(255, 255, 153);">Hello World!</span><br style="color: rgb(255, 255, 153);"><span style="color: rgb(255, 255, 153);">Listen to your heart!</span><br>' from dual)
select regexp_replace(fname, '<[^>]*>', ' ') fname  from t;

FNAME
---------------------------------------
Hello World!   Listen to your heart!

6. Вырезать значение из двойных ковычек

with t(fname) as
(select 'LTD  "GROUP  "BIG WORLD" Las Vegas' from dual)
select replace(regexp_replace(fname, '^([^"]*"(.*)"[^"]*|(.*))$', '\2\3'), '"') fname  from t;

FNAME
----------------
GROUP  BIG WORLD

REGEXP_SUBSTR
1. Вырезать часть строки по заданному шаблону

with t(fname) as
(select '(KERAMIN."user_role_auth"(p_username=>:USER_NAME, p_groupname=>'||chr(39)||'public'||chr(39)||', p_level=>5, p_app_id=>:APP_ID) or KERAMIN."user_role_auth"(p_username=>:USER_NAME, p_groupname=>'||chr(39)||'ADMINISTRATORS'||chr(39)||', p_level=>10, p_app_id=>:APP_ID) or KERAMIN."user_role_auth"(p_username=>:USER_NAME, p_groupname=>'||chr(39)||'users'||chr(39)||', p_level=>15, p_app_id=>:APP_ID))' fname from dual)
select regexp_substr(fname,'KERAMIN."user_role_auth"\(p_username=>:USER_NAME, p_groupname=>[^,]+, p_level=>10, p_app_id=>:APP_ID\)', 1, 1) fname  from t;

FNAME
--------------------------------------------------------------------------------
KERAMIN."user_role_auth"(p_username=>:USER_NAME, p_groupname=>'ADMINISTRATORS',
p_level=>10, p_app_id=>:APP_ID)

2. Делим одну строку на несколько строк с использованием разделителя (например, <,>)

with t as
(select 'O,r,a,c,l,e' fname from dual)
select regexp_substr(fname,'[^,]+', 1, level) fname from t
connect by regexp_substr(fname, '[^,]+', 1, level) is not null;

FNAME
-----------
O
r
a
c
l
e

REGEXP_COUNT
1. Подсчет количества цифр в строке

with t(fname) as
(select '12 mgf45, fhfh-565gh hgh56 66' fname from dual UNION ALL
select 'fd8g78df7g8ghorhegy g rgtueriogti' fname from dual UNION ALL
select '5768hf hgh565 g-+g 676 454ggf55fhgfh' fname from dual)
select regexp_count(fname, '\d') fname from t;

FNAME
----------
11
5
15

2. Подсчет количества символов в строке без учета регистра

with t(fname) as
(select 'A fox is not taken twice in the same snare' fname from dual)
select regexp_count(fname, 'a', 1, 'i') fname from t;

FNAME
----------
4
Реклама

Разбить одну строку на несколько строк

  • Oracle 10g, 11g

Используя иерархический запрос (connect by level) и, зная, что, например, запятая (в кач-ве delimeter) будет делить строку на части, а также задействовав регулярное выражение regexp_substr, можем разбить строку на несколько строк.

with t as
(select 'O,r,a,c,l,e' str from dual)
select regexp_substr(str, '[^,]+', 1, level) res from t
connect by regexp_substr(str, '[^,]+', 1, level) is not null;

res
---
O
r
a
c
l
e