Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 regexp_replace - непростое условие  [new]
Евгений_25
Member

Откуда: Харьков
Сообщений: 460
Есть строка '#F12%34#O4011%A250000%N2010843%G26254112010843/980#D6789#', где реквизиты обрамляются # с двух сторон, т.е.:
1. F12%34
2. O4011%A250000%N2010843%G26254112010843/980
3. D6789
Необходимо вырезать реквизит O4011%A250000%N2010843%G26254112010843/980. Условием для его удаления является то, что это реквизит, т.е. обрамлен # с двух сторон, он начинается на один из следующих символов [DCOAPG], а также, то, что внутри этого реквизита есть не менее одного подреквзита, обрамленного % и также начинающегося на один из символов [DCOAPG]

O4011%A250000 - вырезаем
O4011%A250000%F2010843 - уже не вырезаем

O4011%A250000%N2010843%G26254112010843/980, тут подреквизитами являются:
#O4011% - это обязательное начало
%A250000% - подреквизит
%N2010843% - подреквизит
%G26254112010843/980# - подреквизит
не менее одного подреквизита должно быть, при этом, последний начинается на %, а заканчивается на #

Я не смог придумать, как это сделать, сделал только проверку на обязательное начало и проверку первого подреквизита
SELECT regexp_replace('#F12%34#O4011%A250000%N2010843%G26254112010843/980#D6789#'
                   , '*[#][DCOAPG][^%]*[%][DCOAPG][^#]*')
  FROM dual
12 окт 11, 12:34    [11425839]     Ответить | Цитировать Сообщить модератору
 Re: regexp_replace - непростое условие  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Евгений_25,
~
'*#[DCOAPG][^%#]*?%[DCOAPG]%[^#]*'
12 окт 11, 12:55    [11425991]     Ответить | Цитировать Сообщить модератору
 Re: regexp_replace - непростое условие  [new]
Elic
Member

Откуда:
Сообщений: 29990
, '#[DCOAPG][^#]*%[DCOAPG][^#]*#', '#'
12 окт 11, 13:06    [11426097]     Ответить | Цитировать Сообщить модератору
 Re: regexp_replace - непростое условие  [new]
Евгений_25
Member

Откуда: Харьков
Сообщений: 460
orawish
Евгений_25,
~
'*#[DCOAPG][^%#]*?%[DCOAPG]%[^#]*'


SELECT regexp_replace('#F12%34#O4011%A250000%N2010843%G26254112010843/980#D6789#'
                   , '*#[DCOAPGN][^%#]*?%[DCOAPGN]%[^#]*' )
  FROM dual

result
----------------------------------------------------------------------
#F12%34#O4011%A250000%N2010843%G26254112010843/980#D6789#

а должно вырезать
12 окт 11, 13:51    [11426533]     Ответить | Цитировать Сообщить модератору
 Re: regexp_replace - непростое условие  [new]
Евгений_25
Member

Откуда: Харьков
Сообщений: 460
Elic
, '#[DCOAPG][^#]*%[DCOAPG][^#]*#', '#'


SELECT regexp_replace('#F12%34#O4011%A250000%N2010843%G26254112010843/980#D6789#'
                   , '#[DCOAPG][^#]*%[DCOAPG][^#]*#')
  FROM dual

result
----------------
#F12%34D6789#

не должно вырезать, так как есть %N2010843%
12 окт 11, 13:52    [11426544]     Ответить | Цитировать Сообщить модератору
 Re: regexp_replace - непростое условие  [new]
Elic
Member

Откуда:
Сообщений: 29990
Евгений_25
не должно вырезать, так как есть %N2010843%
Ты сам себе противоречишь:
автор
внутри этого реквизита есть не менее одного подреквзита, обрамленного % и также начинающегося на один из символов [DCOAPG]
12 окт 11, 13:56    [11426587]     Ответить | Цитировать Сообщить модератору
 Re: regexp_replace - непростое условие  [new]
Elic
Member

Откуда:
Сообщений: 29990
И вообще, где ожидаемый результат?! RTFM
12 окт 11, 13:58    [11426606]     Ответить | Цитировать Сообщить модератору
 Re: regexp_replace - непростое условие  [new]
Евгений_25
Member

Откуда: Харьков
Сообщений: 460
Elic
Евгений_25
не должно вырезать, так как есть %N2010843%
Ты сам себе противоречишь:
автор
внутри этого реквизита есть не менее одного подреквзита, обрамленного % и также начинающегося на один из символов [DCOAPG]


согласен, ошибся при написании условия.
Внутри параметра все подреквизиты должны начинаться на один из символов [DCOAPG]

Есть: '#F12%34#O4011%A250000%N2010843%G26254112010843/980#D6789#' и символы [DCOAPG]
Результат: '#F12%34#O4011%A250000%N2010843%G26254112010843/980#D6789#', так как внутри есть %N2010843%

Есть: '#F12%34#O4011%A250000%N2010843%G26254112010843/980#D6789#' и символы [DCOAPGN]
Результат: '#F12%34#D6789#'
12 окт 11, 14:05    [11426664]     Ответить | Цитировать Сообщить модератору
 Re: regexp_replace - непростое условие  [new]
Elic
Member

Откуда:
Сообщений: 29990
Евгений_25
все подреквизиты должны начинаться на один из символов [DCOAPG]
, '#[DCOAPG][^#%]*(%[DCOAPG][^#%]*)+#', '#'
12 окт 11, 14:11    [11426713]     Ответить | Цитировать Сообщить модератору
 Re: regexp_replace - непростое условие  [new]
Евгений_25
Member

Откуда: Харьков
Сообщений: 460
Elic
Евгений_25
все подреквизиты должны начинаться на один из символов [DCOAPG]
, '#[DCOAPG][^#%]*(%[DCOAPG][^#%]*)+#', '#'


ай ай ай ай ай ай ай... не понял я тебя, не понял...(с)

Не до конца разобрался я с этими группами, пробовал почти так (%[DCOAPG][^#%]*), только * выносил за группу, думал, что именно так группа будет несколько раз...

Хотя... и конец поиска у меня был не правильный...

Спасибо Elic.
12 окт 11, 15:23    [11427483]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить