powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция REGEXP_REPLACE
25 сообщений из 40, страница 1 из 2
Функция REGEXP_REPLACE
    #39538540
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, подскажите ,пожалуйста, где допущена ошибка?
Есть регулярное выражение, но при использовании его в функции
Код: plsql
1.
REGEXP_REPLACE

не происходит никакого результата. Ниже код который я использую.
Код: plsql
1.
2.
SELECT REGEXP_REPLACE( code, '\.(\d)(?!\d)', '\.0\1')
FROM test;
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538547
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem, если бы вы описали, что именно ожидаете получить - помощь придет намного быстрее. И вас не смешают с говном за неумение задавать вопросы.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538555
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lary Denis, в столбце code содержатся числа вида: 1.1 1.2 1.11 и с помощью регулярного выражения они должны приводится к виду 1.01 1.02 1.11. Но при использовании данного кода этого не выходит, поэтому я и обратился сюда за помощью т.к не могу понять в чем ошибка.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538562
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem[/src] не происходит никакого результата. Ниже код который я использую.
Код: plsql
1.
(?!\d)


Боюсь, что оракель не понимает эту конструкцию.
Попробуйте так:
Код: plsql
1.
'\.(\d)(\D|$)', '\.0\1'
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538566
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousБоюсь, что оракель не понимает эту конструкцию.
Попробуйте так:
'\.(\d)(\D|$)', '\.0\1'
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538572
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousViacheslav.dem[/src] не происходит никакого результата. Ниже код который я использую.
Код: plsql
1.
(?!\d)


Боюсь, что оракель не понимает эту конструкцию.
Попробуйте так:
Код: plsql
1.
'\.(\d)(\D|$)', '\.0\1'


Попробовал. Выдает результат в виде: 1.01 1.02 1.011 2.11. Дело в том, что когда 1-м символом стоит единица, в числе 1.11 оно приписывает ноль. Не подскажите как изменить регулярное выражение чтобы стал результат вида 1.11?
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538585
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Также число вида 1.1.2 приводит к виду 1.012. А нужен вид 1.01.02.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538586
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem 1.011
Ммм?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with test as (select '1.1' code
from dual union all select  '1.2'
from dual union all select '1.11'
from dual)
SELECT code, REGEXP_REPLACE( code, '\.(\d)(\D|$)', '.0\1')
FROM test;

CODE	REGEXP_REPLACE(CODE,'\.(\D)(\D|$)','.0\1')
1.1	1.01
1.2	1.02
1.11	1.11
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538589
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with s as (select '1.1' as n
  from dual
union all
select '1.2'
  from dual
union all
select '1.11'
  from dual
union all
select '2.11'
  from dual)
select regexp_replace(n,'^([1-9]{1,})\.([1-9]{1})$', '\1.0\2') from s
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538597
Фанат Elic-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В другой ветке, автор писал "Количество вложений которое будет не известно.".

То что выше - не отработает для "2.11.1.11.1.1.111.2.3.4", например.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538602
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousViacheslav.dem 1.011
Ммм?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with test as (select '1.1' code
from dual union all select  '1.2'
from dual union all select '1.11'
from dual)
SELECT code, REGEXP_REPLACE( code, '\.(\d)(\D|$)', '.0\1')
FROM test;

CODE	REGEXP_REPLACE(CODE,'\.(\D)(\D|$)','.0\1')
1.1	1.01
1.2	1.02
1.11	1.11



Вот мой результат запроса:
Код: plsql
1.
select regexp_replace( code, '\.(\d)(\D|$)', '.0\1') from test;


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
REGEXP_REPLACE(CODE,'\.(\D)(\D|$)','.0\1')                                     
--------------------------------------------------------------------------------
2.11.0111.011.023.04                                                            
2.11                                                                            
1.02                                                                            
11                                                                              
1.012                                                                           
11.01                                                                           
1.01                                                                            
1                                                                               
2                                                                               
2.02                                                                            
2.01       
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538604
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, количество вложений которое будет неизвестно. Прошу прощения что не упомянул сразу об этом сразу.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538617
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фанат Elic-aВ другой ветке, автор писал "Количество вложений которое будет не известно.".

То что выше - не отработает для "2.11.1.11.1.1.111.2.3.4", например.
1. с очевидностью надо добавить в строку замены \2
2. Специально для фанатов Виталия: по доке https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm как раз отработает :)
По факту - отработает через одно вхождение, но можно повторить.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538636
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При неизвестном кол-ве одной формулой не обойдёшься, т.к. замена идёт не по экземпляру, а по подходящей маске - маска должна учитывать кол-во точек в данном случае, которое, как следствие, должно быть заранее известно.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538653
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538799
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FogelПри неизвестном кол-ве одной формулой не обойдёшься
Неверно.
См. доку, в конце концов - ссылку я привел.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538840
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousFogelПри неизвестном кол-ве одной формулой не обойдёшься
Неверно.
См. доку, в конце концов - ссылку я привел.

покажи пример выполнения.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538858
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelandrey_anonymousпропущено...

Неверно.
См. доку, в конце концов - ссылку я привел.

покажи пример выполнения.
Чукча не читатель?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
The following example examines country_name. Oracle puts a space after each non-null character in the string.

SELECT
  REGEXP_REPLACE(country_name, '(.)', '\1 ') "REGEXP_REPLACE"
  FROM countries;

REGEXP_REPLACE
--------------------------------------------------------------------------------
A r g e n t i n a
A u s t r a l i a
B e l g i u m
B r a z i l
C a n a d a
. . .

The following example examines the string, looking for two or more spaces. Oracle replaces each occurrence of two or more spaces with a single space.

SELECT
  REGEXP_REPLACE('500   Oracle     Parkway,    Redwood  Shores, CA',
                 '( ){2,}', ' ') "REGEXP_REPLACE"
  FROM DUAL;

REGEXP_REPLACE
--------------------------------------
500 Oracle Parkway, Redwood Shores, CA
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538870
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и применительно к задаче:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
> with t as (select '1.2.3.4.5.6.7.8.9.0' str from dual
)
select str 
     , regexp_replace(str||'.','\.(\d)\.','.0\1.') m_str
     , rtrim(
       regexp_replace(
         regexp_replace(str||'.','\.(\d)\.','.0\1.')
         ,'\.(\d)\.','.0\1.'),'.') m2_str
from t
union all
select str 
     , regexp_replace(str,'\.(\d)(\D|$)','.0\1\2') m_str
     , regexp_replace(
         regexp_replace(str,'\.(\d)(\D|$)','.0\1\2')
         ,'\.(\d)(\D|$)','.0\1\2') m2_str
from t         
STR                 M_STR                     M2_STR                       
------------------- ------------------------- ------------------------------
1.2.3.4.5.6.7.8.9.0 1.02.3.04.5.06.7.08.9.00. 1.02.03.04.05.06.07.08.09.00   
1.2.3.4.5.6.7.8.9.0 1.02.3.04.5.06.7.08.9.00  1.02.03.04.05.06.07.08.09.00   
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538898
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousНу и применительно к задаче:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
> with t as (select '1.2.3.4.5.6.7.8.9.0' str from dual
)
select str 
     , regexp_replace(str||'.','\.(\d)\.','.0\1.') m_str
     , rtrim(
       regexp_replace(
         regexp_replace(str||'.','\.(\d)\.','.0\1.')
         ,'\.(\d)\.','.0\1.'),'.') m2_str
from t
union all
select str 
     , regexp_replace(str,'\.(\d)(\D|$)','.0\1\2') m_str
     , regexp_replace(regexp_replace(str,'\.(\d)(\D|$)','.0\1\2')
         ,'\.(\d)(\D|$)','.0\1\2') m2_str
from t         
STR                 M_STR                     M2_STR                       
------------------- ------------------------- ------------------------------
1.2.3.4.5.6.7.8.9.0 1.02.3.04.5.06.7.08.9.00. 1.02.03.04.05.06.07.08.09.00   
1.2.3.4.5.6.7.8.9.0 1.02.3.04.5.06.7.08.9.00  1.02.03.04.05.06.07.08.09.00   



о чём и речь, где здесь одна формула?
2 формулы
FogelПри неизвестном кол-ве одной формулой не обойдёшься ...
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538912
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelо чём и речь, где здесь одна формула?
2 формулы
FogelПри неизвестном кол-ве одной формулой не обойдёшься ...

Да ну? Об этом ли речь?
FogelПри неизвестном кол-ве одной формулой не обойдёшься ... маска должна учитывать кол-во точек в данном случае, которое, как следствие, должно быть заранее известно.

Ну и в каком месте маска учитывает количество точек, если речь "о чем"?

Речь на самом деле о другом:

andrey_anonymousФанат Elic-aВ другой ветке, автор писал "Количество вложений которое будет не известно.".

То что выше - не отработает для "2.11.1.11.1.1.111.2.3.4", например.
1. с очевидностью надо добавить в строку замены \2
2. Специально для фанатов Виталия: по доке https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm как раз отработает :)
По факту - отработает через одно вхождение, но можно повторить.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538940
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous...
Речь на самом деле о другом
...
ага, на самом деле тебе лучше знать, что я написал.
можно хоть войну и мир любой регуляркой бесконечно вложенной распарсить.
я написал про одну формулу. на этом и надо было остановиться без косноязычных пояснений.

кол-во точек, кстати, учитывается.
только не в абсолютном выражении, а в признаке чётный/нечётный.
по чётному кол-ву достаточно одной формулы. при нечётном - не получается одинаковой маски, одна точка выпадает, поэтому два прохода.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538944
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelпо чётному кол-ву достаточно одной формулы.
Покажи, сказочник :)
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538971
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousFogelпо чётному кол-ву достаточно одной формулы.
Покажи, сказочник :)

ну ты в ударе сегодня.
я не настолько крут, чтобы спускаться с небес на землю.

в этом я ошибся - не работает, как я думал.

но про одну формулу - это было про одну формулу.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39538997
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelно про одну формулу - это было про одну формулу.
Так и формула одна - присмотрись.
Два вызова - потому что oracle не умеет конструкции, позволяющие маску не захватывать .
А потому хвостовую точку повторно не читает=> фейлит маску на непосредственно следующим за обнаруженной последовательности ("не хватает" лидирующей точки).
Отсюда два вызова.
Если этот недостаток устранить, то ты пролетаешь и с самым слабым утверждением про "одну формулу":
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
> with t as (select '1.2.3.4.5.6.7.8.9.0' str from dual
)
select str 
     , ltrim(regexp_replace(str,'\D?(\d)(\D|$)','0\1\2'),'0') m_str
from t         
STR                 M_STR                        
------------------- ------------------------------
1.2.3.4.5.6.7.8.9.0 1.02.03.04.05.06.07.08.09.00   



Ы?
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция REGEXP_REPLACE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]