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

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


Боюсь, что оракель не понимает эту конструкцию.
Попробуйте так:
Код: plsql
1.
'\.(\d)(\D|$)', '\.0\1'
...
Рейтинг: 0 / 0
19.10.2017, 11:23
    #39538566
Lary Denis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
andrey_anonymousБоюсь, что оракель не понимает эту конструкцию.
Попробуйте так:
'\.(\d)(\D|$)', '\.0\1'
...
Рейтинг: 0 / 0
19.10.2017, 11:35
    #39538572
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
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
19.10.2017, 11:52
    #39538585
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
Также число вида 1.1.2 приводит к виду 1.012. А нужен вид 1.01.02.
...
Рейтинг: 0 / 0
19.10.2017, 11:53
    #39538586
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
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
19.10.2017, 11:56
    #39538589
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
Код: 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
19.10.2017, 12:03
    #39538597
Фанат Elic-a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
В другой ветке, автор писал "Количество вложений которое будет не известно.".

То что выше - не отработает для "2.11.1.11.1.1.111.2.3.4", например.
...
Рейтинг: 0 / 0
19.10.2017, 12:08
    #39538602
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
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
19.10.2017, 12:10
    #39538604
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
Да, количество вложений которое будет неизвестно. Прошу прощения что не упомянул сразу об этом сразу.
...
Рейтинг: 0 / 0
19.10.2017, 12:23
    #39538617
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
Фанат 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
19.10.2017, 12:38
    #39538636
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
При неизвестном кол-ве одной формулой не обойдёшься, т.к. замена идёт не по экземпляру, а по подходящей маске - маска должна учитывать кол-во точек в данном случае, которое, как следствие, должно быть заранее известно.
...
Рейтинг: 0 / 0
19.10.2017, 13:04
    #39538653
Viacheslav.dem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
Спасибо.
...
Рейтинг: 0 / 0
19.10.2017, 15:24
    #39538799
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
FogelПри неизвестном кол-ве одной формулой не обойдёшься
Неверно.
См. доку, в конце концов - ссылку я привел.
...
Рейтинг: 0 / 0
19.10.2017, 15:50
    #39538840
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
andrey_anonymousFogelПри неизвестном кол-ве одной формулой не обойдёшься
Неверно.
См. доку, в конце концов - ссылку я привел.

покажи пример выполнения.
...
Рейтинг: 0 / 0
19.10.2017, 15:59
    #39538858
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
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
19.10.2017, 16:08
    #39538870
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
Ну и применительно к задаче:
Код: 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
19.10.2017, 16:24
    #39538898
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
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
19.10.2017, 16:33
    #39538912
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
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
19.10.2017, 16:56
    #39538940
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
andrey_anonymous...
Речь на самом деле о другом
...
ага, на самом деле тебе лучше знать, что я написал.
можно хоть войну и мир любой регуляркой бесконечно вложенной распарсить.
я написал про одну формулу. на этом и надо было остановиться без косноязычных пояснений.

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

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

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

но про одну формулу - это было про одну формулу.
...
Рейтинг: 0 / 0
19.10.2017, 17:33
    #39538997
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция REGEXP_REPLACE
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция REGEXP_REPLACE / 25 сообщений из 40, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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