powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция REGEXP_REPLACE
15 сообщений из 40, страница 2 из 2
Функция REGEXP_REPLACE
    #39539026
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousЫ?
Кстати, недостаток разделителей можно устранить, не сломав решение задачи "одной формулой":
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
> with t as (select '1.22.3.4.5.63.7.8.9.0' str from dual
)
select str 
     , replace(regexp_replace(replace(str,'.','..'),'\.(\d)(\.|$)','.0\1'),'..','.') m_str
from t         
STR                   M_STR                        
--------------------- ------------------------------
1.22.3.4.5.63.7.8.9.0 1.22.03.04.05.63.07.08.09.00   



Недостаток - сильно увеличивает размер промежуточной валидной строки и может вылезти за "габарит"
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39539074
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousFogelно про одну формулу - это было про одну формулу.
Так и формула одна - присмотрись.
Два вызова - потому что 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 / 0
Функция REGEXP_REPLACE
    #39539410
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, а не могли бы Вы подсказать каким образом еще можно поставить ноль перед 1-м символом? Сам пытаюсь - не выходит.
Т.е 01.01 02.22
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39539423
Viacheslav.dem,

Код: plsql
1.
2.
3.
4.
5.
with t as (select '1.22.3.4.5.63.7.8.9.0' str from dual
)
select str 
     , trim('.' from replace(regexp_replace(replace('.' || str,'.','..'),'\.(\d)(\.|$)','.0\1'),'..','.')) m_str
from t;
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39539428
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шутник Ореховский, Спасибо большое.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39541490
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, мне надо сделать сортировку order by. Можно ли преобразовать строку в число с разделителем "." в формате 09? Сделал сортировку до 1-й точки
Код: plsql
1.
 to_char(substr(CODE, 1, instr(CODE||'.','.',1)-1), '09')

как сделать сортировку если n-ое количество точек. Вариант выше работает хорошо, но можно ли сделать сортировку не подставляя нули как описано выше?
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39543178
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem,

не совсем понятно, чем Вам мешает "подстановка нулей"?

покажите тестовые данные, и результат который ожидаете

зы
я в регулярках двоечник (пока токо учусь)

.....
stax
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39543252
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Есть таблица с кодом (varchar), при сортировке по коду, оракл выводит вот так:

Код: sql
1.
2.
3.
4.
5.
1
11
2.1
2.11
2.3



А нужно:

Код: sql
1.
2.
3.
4.
5.
1
2.1
2.3
2.11
11



n-ое количество уровней.
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39543255
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem,

Код: plsql
1.
order by Lpad(field,10) 

?
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39543257
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem,

10 можно заменить на максимальную длину varchar +1
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39543263
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.demn-ое количество уровней.

Сорри, не дочитал, мой вариант не подойдет =(
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39543315
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem,
не больше 9999 (4 цифры)

влоб для цифр

Код: 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.
26.
27.
28.
29.
  1  with t(s) as (
  2  select '1' from dual union all
  3  select '11' from dual union all
  4  select '2.2' from dual union all
  5  select '2.1' from dual union all
  6  select '2.11' from dual union all
  7  select '2.3' from dual union all
  8  select '1.1.10' from dual union all
  9  select '1.1.2' from dual union all
 10  select '1.22.331' s from dual
 11  )
 12  select s ss
 13  from t
 14* order by regexp_replace(regexp_replace(s,'(\d+)','00000\1'),'0*(\d{4})','\1')
SQL> /

SS
--------------------
1
1.1.2
1.1.10
1.22.331
2.1
2.2
2.3
2.11
11

9 rows selected.



.....
stax
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39543419
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Спасибо, но между разделителям может присутствовать максимум 2 цифры (т.е маска 09). По вашей таблице в выделенной записи должно быть 1.22.33

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
1
1.1.2
1.1.10
1.22.331
2.1
2.2
2.3
2.11
11
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39543435
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav.dem,

если максимум две цифры, то достаточно
regexp_replace(regexp_replace(s,'(\d+)','000\1'),'0*(\d{ 2 })','\1')

.....
stax
...
Рейтинг: 0 / 0
Функция REGEXP_REPLACE
    #39543517
Viacheslav.dem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,Спасибо!
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция REGEXP_REPLACE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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