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

Откуда:
Сообщений: 223
Добрый вечер!
Не могу составить регулярное выражение. Мне необходимо найти слово 'слово' в предложении, которое не находится внутри кавычек
Например дана последовательность
слово мама картофель "слово" 

берем первое 'слово'
мама картофель "слово"  слово 

берем второе 'слово'
"мама картофель слово пингвин"  слово 

берем второе слово

Необходимо, чтобы после нужного нам 'слово' шло [:space:]

Подскажите, а то я уже устал подбирать, опыта в таких делах не имею
12 сен 16, 22:55    [19656948]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
Adylov Timur
Member

Откуда:
Сообщений: 223
Adylov Timur,
declare
  sql_text varchar2(4000):= 'слово " слово картина"';
begin
    dbms_output.put_line(REGEXP_INSTR(sql_text, '"[[:space:]|[:alnum:]|,|\.|:|;|\\|<|>|\?|/|''|\||!@|#|$|%|^|&|\*|(|)|_|+|=|-]*слово[[:space:]|[:alnum:]|,|\.|:|;|\\|<|>|\?|/|''|\||!@|#|$|%|^|&|\*|(|)|_|+|=|-]*"',1,1,0,'i'));
end;

что-то вроде такого наоборот ищет слово в кавычках, а теперь надо наоборот.
Как это можно сделать???
12 сен 16, 23:52    [19657035]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
пара слов:&quot;слов слов&am
Guest
Adylov Timur,

цикл по инстрам.
13 сен 16, 01:00    [19657107]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Adylov Timur
что-то вроде такого наоборот ищет слово в кавычках, а теперь надо наоборот.
Как это можно сделать???


Если нет многоуровнего вложения двойных кавычeк, то:

REGEXP_SUBSTR(
              REGEXP_REPLACE(строка,'"[^"]*"','|'), -- мeняем "текст в двойных кавычках" на |
              'слово' -- ищем слово
             )


SY.
13 сен 16, 02:04    [19657143]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
Adylov Timur
Member

Откуда:
Сообщений: 223
Мне нужно узнать номер позиции вхождения этого слова. Так я не смогу узнать
SY

Если нет многоуровнего вложения двойных кавычeк, то:

REGEXP_SUBSTR(
              REGEXP_REPLACE(строка,'"[^"]*"','|'), -- мeняем "текст в двойных кавычках" на |
              'слово' -- ищем слово
             )


SY.
13 сен 16, 21:34    [19661439]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
123йй
Member

Откуда:
Сообщений: 1637
Adylov Timur
номер позиции
замени substr на instr
14 сен 16, 08:33    [19662104]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
Elic
Member

Откуда:
Сообщений: 29988
123йй
Adylov Timur
номер позиции
замени substr на instr
Ты не заметил, что позиции уже убиты до этого?
14 сен 16, 08:46    [19662141]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
123йй
Member

Откуда:
Сообщений: 1637
Elic,

упс.
'|' на rpad('|', length(regexp_substr(
14 сен 16, 11:20    [19662890]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
Elic
Member

Откуда:
Сообщений: 29988
123йй
упс.
'|' на rpad('|', length(regexp_substr(
Ну-ну…
'"словечко" "слово" слово'
14 сен 16, 11:28    [19662958]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Adylov Timur
Мне нужно узнать номер позиции вхождения этого слова.
Поскольку в оракловых регулярках не реализовано negative lookahead/lookbehind, то приходится извращаться.
SQL> with t0
  2       as (select 'slovo1 mama kkk "slovo2"' str from dual
  3           union all
  4           select '"mama" kkk "slovo1" slovo2' id from dual
  5           union all
  6           select '"mama kkk slovo1 ppp" slovo2' id from dual),
  7       t1 as (select replace(str, 'slovo', '#') str from t0),
  8       t2 as (select regexp_replace(str, '(("[^"]*"[^#"]*)*)(#)', '\1@\3', 1, 1) str from t1),
  9       t3 as (select replace(str, '#', 'slovo') str from t2)
 10  select replace(str, '@', '') str, regexp_instr(str, '@slovo') idx
 11    from t3;

STR                                                       IDX
-------------------------------------------------- ----------
slovo1 mama kkk "slovo2"                                    1
"mama" kkk "slovo1" slovo2                                 21
"mama kkk slovo1 ppp" slovo2                               23
14 сен 16, 13:27    [19663778]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
-2-
Member

Откуда:
Сообщений: 15330
если полагаться на строгую парность скобок, то достаточно оперделить их четность по одну сторону от искомого
regexp_instr(str, 'слово([^"]*"[^"]*")*[^"]*$')
14 сен 16, 13:57    [19664034]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
По совету SY
Guest
with t as (select '"просто слово" то что нужно - слово выбрать "не слово"' as s, 'слово' as p from dual)
select s,
       p,
       regexp_replace(s,'("[^"]*)'||p||'([^"]*)"','\1'||lpad('~',length(p),'~')||'\2'),
       instr(regexp_replace(s,'("[^"]*)'||p||'([^"]*)"','\1'||lpad('~',length(p),'~')||'\2'),p),
       substr(s,instr(regexp_replace(s,'("[^"]*)'||p||'([^"]*)"','\1'||lpad('~',length(p),'~')||'\2'),p))
from t
;


P.S. что-то там с пробелом
14 сен 16, 15:19    [19664761]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
По совету SY


Ну такого я точно не советовал посколько прекрасно понимaю слово внутри кавычек может встретится многократно.

SY.
14 сен 16, 19:25    [19665935]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
Adylov Timur
Member

Откуда:
Сообщений: 223
SY, как-то так можно

declare
sql_text varchar2(4000):= '"папа слово машина слово" "куршавель слово мент" слово "слово"';
sql_text_test varchar2(4000);
l_count number;
begin
sql_text_test := sql_text;
LOOP
IF (REGEXP_INSTR(sql_text_test, '"[^"]*"',1,1,0,'i') = 0) THEN
EXIT;
END IF;

l_count := REGEXP_INSTR(sql_text_test, '"[^"]*"',1,1,1,'i') - REGEXP_INSTR(sql_text_test, '"[^"]*"',1,1,0,'i');
sql_text_test := REGEXP_REPLACE(sql_text_test, '"[^"]*"', rpad(' ', l_count),1,1,'i');
END LOOP;
dbms_output.put_line(sql_text_test);
end;
14 сен 16, 21:14    [19666244]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Adylov Timur
SY, как-то так можно


Ну и где здесь "нужно узнать номер позиции вхождения этого слова"?

Воспользуйся решением от -2- 19657143

SY.
15 сен 16, 03:06    [19666650]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
fortnet
Member

Откуда:
Сообщений: 526
Чисто для прикола...

select str,idx from (
select substr(s,1,A_IDX-1) || lpad('~',A_LEN,'~') || substr(s,A_LEN+1,B_IDX-A_LEN-1) || lpad('~',B_LEN,'~') as str
,instr(substr(s,1,A_IDX-1) || lpad('~',A_LEN,'~') || substr(s,A_LEN+1,B_IDX-A_LEN-1) || lpad('~',B_LEN,'~'),'слово ') as idx
,A_QU, A_IDX, A_LEN, B_QU, B_IDX, B_LEN, C_QU, C_LEN, C_IDX from (
select s, level lv, regexp_substr(s, '(")([^"]*)(")',1,level) quote, length(regexp_substr(s, '(")([^"]*)(")',1,level)) len
,regexp_instr(s, '(")([^"]*)(")',1,level) indx
from(
select 'слово " слово картина"' as s from dual
)
connect by regexp_substr(s, '(")([^"]*)(")',1,level) is not null
)
pivot(
max(quote) as qu, max(indx) as idx, max(len) as len for (lv) in ('1' as a, '2' as b, '3' as c, '4' d )
)
)
15 сен 16, 17:05    [19669940]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
fortnet,

Тебе надо к психиатру...
15 сен 16, 22:19    [19670965]     Ответить | Цитировать Сообщить модератору
 Re: регулярное выражение  [new]
fortnet
Member

Откуда:
Сообщений: 526
dbms_photoshop,
Неожиданная реакция...
паранойя ментора?

Оцениватель прекрасного ....
16 сен 16, 08:47    [19671536]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить