Используем регулярное выражение с REGEXP_LIKE для удаления последней буквы в строке:
with t as
( select 'H18.DHSHJ7' as str from dual
union all select 'H18.AAA1A' from dual
union all select 'H18.AAA10' from dual
union all select 'H18.AAAB4B' from dual
)
select t.str, regexp_replace(str, '[[:alpha:]]$','')
from t
SQL>
STR REGEXP_REPLACE(STR,'[[:ALPHA:]
---------- ------------------------------------------------------------------
H18.DHSHJ7 H18.DHSHJ7
H18.AAA1A H18.AAA1
H18.AAA10 H18.AAA10
H18.AAAB4B H18.AAAB4
Для удаления последней цифры заменяем [[:alpha:]] на [[:digit:]]
with t as
( select 'H18.DHSHJ7' as str from dual
union all select 'H18.AAA1A' from dual
union all select 'H18.AAA10' from dual
union all select 'H18.AAAB4B' from dual
)
select t.str, regexp_replace(str, '[[:digit:]]$','')
from t
SQL>
STR REGEXP_REPLACE(STR,'[[:DIGIT:]
---------- -------------------------------------------------------------------
H18.DHSHJ7 H18.DHSHJ
H18.AAA1A H18.AAA1A
H18.AAA10 H18.AAA1
H18.AAAB4B H18.AAAB4B
Для удаления управляющих символов (не отображаемых) можно использовать регулярные выражения:
- REGEXP_LIKE — для поиска значений с управляющими символами
- REGEXP_REPLACE — для удаления управляющих символов
select str, regexp_replace(t.str, '[[:cntrl:]]') as new_str
from (
select 'test1'||chr(28) as str from dual
union all
select 'test2' from dual
union all
select 'test3+_*- =\\\|()^%#3@' from dual
) t
where regexp_like(t.str, '[[:cntrl:]]')
STR NEW_STR
---------------------- ----------------------
test1 test1
Пример использования регулярного выражения (regexp_replace)
— оставить только буквы
— оставить только цифры
with t as (select '#2 apps(0_-ORACLE+*.ru_ )ПРИ13мер' str from dual)
select str
, regexp_replace(str,'[^[[:alpha:]]]*') as only_char
, regexp_replace(str,'[^[[:digit:]]]*') as only_number
from t
/
STR ONLY_CHAR ONLY_NUMBER
--------------------------------- ------------------------ --------------------
#2 apps(0_-ORACLE+*.ru_ )ПРИ13мер appsORACLEruПРИмер 2013
Для замены N-ного символа в строке, можно обойтись и без SUBSTR — использовать REGEXP_REPLACE.
select regexp_replace('208010100000','.','X', 5, 1) as res from dual
union all
select regexp_replace('208010100000','.','X', 2, 1) as res from dual;
RES
------------
2080X0100000
2X8010100000
GREEDY AND LAZY IN REGEXP
Квантификация — поиск последовательностей;
Определяет, сколько раз предшествующее выражение может встречаться.
Квантификатор может относиться более чем к одному символу в регулярном выражении, только если это символьный класс или группа.
Таблица 2: Квантификаторы и операторы повтора
Квантификатор |
Описание |
Пример |
* |
Встречается 0 и более раз |
REGEXP_REPLACE(str, ’11*’, ‘1’)
Результат:
test11 => test1
11123345 => 123345 |
? |
Встречается 0 или 1 раз |
|
+ |
Встречается 1 и более раз |
REGEXP_LIKE(str,’5+’)
Результат:
test11 => false
11123345 => true |
{m} |
Встречается ровно m раз |
REGEXP_LIKE(str,’3{2}’)
Результат:
test11 => false
11123345 => true |
{m,} |
Встречается по крайней мере m раз |
|
{m, n} |
Встречается по крайней мере m раз, но не более n раз |
|
Жадная квантификация — это стремление захватить максимально длинную строку, которая соответствует шаблону.
SQL> with t as (
2 select '<div><img src="http://apps-oracle.ru/logo2.png" alt=""/></div>' str from dual
3 )
4 select regexp_substr(str,'<.*>') as res from t;
RES
--------------------------------------------------------------
<div><img src="http://apps-oracle.ru/logo2.png" alt=""/></div>
Ленивая квантификация — это стремление захватить максимально короткую строку, которая соответствует шаблону. Поддерживается с версии 10gR2.
SQL> with t as (
2 select '<div><img src="http://apps-oracle.ru/logo2.png" alt=""/></div>' str from dual
3 )
4 select regexp_substr(str,'<.*?>') as res from t;
RES
-----
<div>
Жадный |
Ленивый |
* |
*? |
+ |
+? |
{n,} |
{n,}? |
Используя regexp_substr, получим дробные числа из строки.
SELECT regexp_substr(str, '([[:digit:]]+[.]{1}[[:digit:]]+)+', 1, level) str
FROM (
SELECT ' 5646.45, 45 sd eds,.sd 9 2 566.11 12.3' str FROM dual) t
CONNECT BY
regexp_substr(str,'([[:digit:]][.]{1}[[:digit:]])+',1, level) is not null;
STR
---------------------------------------
5646.45
566.11
12.3
with t as (
select 'есть длинная строка - которую нужно разбить на строчки по сто символов.'
|| 'Но слова разбивать нельзя, переносить нужно по '
||rpad('qwerty',110,'o')||'абвгд' as s from dual
)
select trim(regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level))
from t
CONNECT BY
regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level) is not null;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as apps
SQL> with t as (
2 select 'есть длинная строка - которую нужно разбить на строчки по сто символов.'
3 || 'Но слова разбивать нельзя, переносить нужно по '
4 ||rpad('qwerty',110,'o')||'абвгд' as s from dual
5 )
6 select trim(regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level)) as str
7 from t
8 CONNECT BY
9 regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level) is not null;
STR
--------------------------------------------------------------------------------
есть длинная строка - которую нужно разбить на строчки по сто символов.Но слова
переносить нужно по
qwertyoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooабвгд
Для строки «asdfdasf,abs@dev, sdfasdf» надо найти вхождение «abs@» и заменить на «abs@fn», но только в том случае, если перед вхождением запятая или пробел.
select regexp_replace(str, '([, ]abs@)', '\1fn') as val
from (select 'aabs@sdfdasf,abs@dev, sd abs@fasdf' str from dual)
--
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as apps
SQL> select regexp_replace(str, '([, ]abs@)', '\1fn') as val
2 from (select 'aabs@sdfdasf,abs@dev, sd abs@fasdf' str from dual);
VAL
--------------------------------------
aabs@sdfdasf,abs@fndev, sd abs@fnfasdf
SQL>
Регулярные выражения произошли из теорий автоматов и формальных языков, поэтому поначалу производят устрашающее впечатление. Однако, их базовые понятия являются простыми и в то же время мощными.
Начиная с версии Oracle 10g регулярные выражения можно использовать напрямую в SQL запросах.
Шаблон регулярных выражений выражается в виде строки, содержащей следующие конструкции:
- Литеральные символы. Фактические символы, которые следует искать (Например, шаблон xyz соответствует только вхождению «xyz»)
- Метасимволы. Операции, определяющие алгоритмы, которые должны применяться во время поиска (Например, шаблон ^xyz соответсвует только строке, начинающейся с «xyz» — другие вхождения не учитываются)
Читать дальше про “Регулярные выражения Oracle (regular expression)” »
Последние комментарии