Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 помогите с регулярным выражением  [new]
reg_reg
Guest
Задача выбрать все строки, содержащие слова, которые начинаются с xyz_ и после подчеркивания не содержат {a,b,c}.
Набросал решение, которое заменяет все не (английские символы или цифры или подчеркивание) на пробелы и затем ищет вхождение с предшествующим пробелом.
with t as
(select 'qwe asd zxc xyz_e zzz' name from dual
union all select 'qwe asd zxc xyz_a zzz' from dual
union all select 'qwe asd zxc xyz_azzz' from dual
union all select 'qwe asd zxc xyzzzz' from dual
union all select 'qwe asd,xyz_izzz,123' from dual
union all select 'xyz_Q' from dual
union all select 'xyz_Q xyz_a' from dual
union all select 'xyz_a xyz_Q' from dual
union all select 'xyzxyz_Q' from dual
union all select 'qwe asd'||chr(10)||'xyz_zzz)123' from dual)
select *
from
(select translate(name,' '||translate(lower(name),'~_abcdefghijklmnopqrstuvwxyz1234567890','~'),lpad(' ',4000)) name from t)
where instr(' '||name,' xyz_')>0
and instr(' '||name,' xyz_a')<>instr(' '||name,' xyz_')
and instr(' '||name,' xyz_b')<>instr(' '||name,' xyz_')
and instr(' '||name,' xyz_c')<>instr(' '||name,' xyz_')
NAME                 
---------------------
qwe asd zxc xyz_e zzz
qwe asd xyz_izzz 123 
xyz_Q                
xyz_Q xyz_a          
qwe asd xyz_zzz 123  

5 rows selected.
Решение довольно громоздкое и учитывает только символы английского алфавита, хотя в идеале хотелось бы любого. Кроме того, в результат не попадает (по понятным причинам) строка "xyz_a xyz_Q", хотя должна.
Можно ли как-то лаконично решить используя регулярусы?
17 дек 12, 14:57    [13643117]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
reg_reg
Guest
В ответе дожны быть оригинальные строки (а не с подставленными пробелами), то просто у меня издержки копипасты.
17 дек 12, 15:01    [13643153]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
with t as
(select 'qwe asd zxc xyz_e zzz' name from dual
union all select 'qwe asd zxc xyz_a zzz' from dual
union all select 'qwe asd zxc xyz_azzz' from dual
union all select 'qwe asd zxc xyzzzz' from dual
union all select 'qwe asd,xyz_izzz,123' from dual
union all select 'xyz_Q' from dual
union all select 'xyz_Q xyz_a' from dual
union all select 'xyz_a xyz_Q' from dual
union all select 'xyzxyz_Q' from dual
union all select 'qwe asd'||chr(10)||'xyz_zzz)123' from dual)
select  *
  from  t
  where regexp_like(name,'xyz_[^abc]+(\W|$)')
/

NAME
---------------------
qwe asd zxc xyz_e zzz
qwe asd,xyz_izzz,123
xyz_Q
xyz_Q xyz_a
xyz_a xyz_Q
xyzxyz_Q
qwe asd
xyz_zzz)123


7 rows selected.

SQL> 


SY.

Сообщение было отредактировано: 17 дек 12, 15:12
17 дек 12, 15:08    [13643219]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
Бродяга2010
Member

Откуда: Киев
Сообщений: 57
Вроде как-то так...

with tt as (select 'qwe asd zxc xyz_e zzz' name from dual
            union all select 'qwe asd zxc xyz_a zzz' from dual
            union all select 'qwe asd zxc xyz_azzz' from dual
            union all select 'qwe asd zxc xyzzzz' from dual
            union all select 'qwe asd,xyz_izzz,123' from dual
            union all select 'xyz_Q' from dual
            union all select 'xyz_Q xyz_a' from dual
            union all select 'xyz_a xyz_Q' from dual
            union all select 'xyzxyz_Q' from dual
            union all select 'qwe asd'||chr(10)||'xyz_zzz)123' from dual)
select *
from tt
where regexp_like(tt.name, '(^|[^[:alnum:]])xyz_[^abc]')
17 дек 12, 15:09    [13643237]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
reg_reg
Guest
Вроде получилось решение, дающее правильный резыльтат, но громоздкость еще усугубилась:
select name from
(select translate(name_mod,' '||translate(lower(name_mod),'~_abcdefghijklmnopqrstuvwxyz1234567890','~'),lpad(' ',4000)) name_mod, name from
(select * from (select replace(replace(replace(name,'xyz_c',''),'xyz_b',''),'xyz_a','') name_mod, name from t)))
where instr(' '||name_mod,' xyz_')>0
17 дек 12, 15:11    [13643246]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
reg_reg
Guest
SY, "xyzxyz_Q" - лишнее.
Бродяга2010, спасибо, вроде оно.
17 дек 12, 15:14    [13643274]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Бродяга2010,

не пойдет, так как даже на xyz_qa сработает
17 дек 12, 16:23    [13644053]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
~
with t as
(select 'qwe asd zxc xyz_e zzz' s from dual
union all select 'qwe asd zxc xyz_a zzz' from dual
union all select 'qwe asd zxc xyz_azzz' from dual
union all select 'qwe asd zxc xyzzzz' from dual
union all select 'qwe asd,xyz_izzz,123' from dual
union all select 'xyz_Q' from dual
union all select 'xyz_Q xyz_a' from dual
union all select 'xyz_a xyz_Q' from dual
union all select 'xyzxyz_Q' from dual
union all select 'qwe asd'||chr(10)||'xyz_zzz)123' from dual)
select s
  from t
where regexp_like (regexp_replace(s,'(^|\s)xyz\S*(a|b|c)\S*'),'(^|\s)xyz');
17 дек 12, 16:39    [13644233]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
with t as
(select 'qwe asd zxc xyz_e zzz' name from dual
union all select 'qwe asd zxc xyz_a zzz' from dual
union all select 'qwe asd zxc xyz_azzz' from dual
union all select 'qwe asd zxc xyzzzz' from dual
union all select 'qwe asd,xyz_izzz,123' from dual
union all select 'xyz_Q' from dual
union all select 'xyz_Q xyz_a' from dual
union all select 'xyz_a xyz_Q' from dual
union all select 'xyzxyz_Q' from dual
union all select 'qwe asd'||chr(10)||'xyz_zzz)123' from dual)
select  *
  from  t
  where regexp_like(name,'(\W|^)xyz_[^abc]+(\W|$)') 
    and not regexp_like(name,'(\W|^)xyz_\w*[abc]')
17 дек 12, 16:45    [13644298]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
xtender,

автор
.. в результат не попадает (по понятным причинам) строка "xyz_a xyz_Q", хотя должна.

:)
17 дек 12, 16:52    [13644375]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
orawish,

блин, тогда я не понял, почему решение Соломона забраковали?
17 дек 12, 16:54    [13644388]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
orawish,

а, все, каюсь - не так прочел :)
Просто второй предикат убрать надо:
with t as
(select 'qwe asd zxc xyz_e zzz' name from dual
union all select 'qwe asd zxc xyz_a zzz' from dual
union all select 'qwe asd zxc xyz_azzz' from dual
union all select 'qwe asd zxc xyzzzz' from dual
union all select 'qwe asd,xyz_izzz,123' from dual
union all select 'xyz_Q' from dual
union all select 'xyz_Q xyz_a' from dual
union all select 'xyz_a xyz_Q' from dual
union all select 'xyzxyz_Q' from dual
union all select 'qwe asd'||chr(10)||'xyz_zzz)123' from dual)
select  *
  from  t
  where regexp_like(name,'(\W|^)xyz_[^abc]+(\W|$)') 
17 дек 12, 16:55    [13644402]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
reg_reg
Guest
xtender
Бродяга2010,

не пойдет, так как даже на xyz_qa сработает
Так и должно. Я был неточен.
Задача выбрать все строки, содержащие слова, которые начинаются с xyz_ и непосредственно после подчеркивания не содержат {a,b,c}.
Хотя это можно было увидеть по моей логике ч-з instr.
Все равно всем спасибо.
17 дек 12, 17:01    [13644463]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
reg_reg
Guest
orawish,

Все три строки попадают в результат, хотя ни одна не должна.
with t as
(select 'xyz+Q' s from dual
union all select 'xyzQ' from dual
union all select 'xyzxyz+Q' from dual)
17 дек 12, 17:23    [13644603]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
reg_reg
SY, "xyzxyz_Q" - лишнее.


with t as
(select 'qwe asd zxc xyz_e zzz' name from dual
union all select 'qwe asd zxc xyz_a zzz' from dual
union all select 'qwe asd zxc xyz_azzz' from dual
union all select 'qwe asd zxc xyzzzz' from dual
union all select 'qwe asd,xyz_izzz,123' from dual
union all select 'xyz_Q' from dual
union all select 'xyz_Q xyz_a' from dual
union all select 'xyz_a xyz_Q' from dual
union all select 'xyzxyz_Q' from dual
union all select 'qwe asd'||chr(10)||'xyz_zzz)123' from dual)
select  *
  from  t
  where regexp_like(name,'(\W|^)xyz_[^abc]+(\W|$)')
/

NAME
------------------------------
qwe asd zxc xyz_e zzz
qwe asd,xyz_izzz,123
xyz_Q
xyz_Q xyz_a
xyz_a xyz_Q
qwe asd
xyz_zzz)123


6 rows selected.

SQL> 


SY.
17 дек 12, 17:49    [13644781]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
reg_reg
Я был неточен.
Задача выбрать все строки, содержащие слова, которые начинаются с xyz_ и непосредственно после подчеркивания не содержат {a,b,c}.


with t as
(select 'qwe asd zxc xyz_e zzz' name from dual
union all select 'qwe asd zxc xyz_a zzz' from dual
union all select 'qwe asd zxc xyz_azzz' from dual
union all select 'qwe asd zxc xyzzzz' from dual
union all select 'qwe asd,xyz_izzz,123' from dual
union all select 'xyz_Q' from dual
union all select 'xyz_Q xyz_a' from dual
union all select 'xyz_a xyz_Q' from dual
union all select 'xyzxyz_Q' from dual
union all select 'qwe asd'||chr(10)||'xyz_zzz)123' from dual)
select  *
  from  t
  where regexp_like(name,'(\W|^)xyz_[^abc]')
/

NAME
------------------------------
qwe asd zxc xyz_e zzz
qwe asd,xyz_izzz,123
xyz_Q
xyz_Q xyz_a
xyz_a xyz_Q
qwe asd
xyz_zzz)123


6 rows selected.

SQL> 


SY.

Сообщение было отредактировано: 17 дек 12, 18:05
17 дек 12, 17:52    [13644803]     Ответить | Цитировать Сообщить модератору
 Re: помогите с регулярным выражением  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
reg_reg
orawish,

Все три строки попадают в результат, хотя ни одна не должна.
with t as
(select 'xyz+Q' s from dual
union all select 'xyzQ' from dual
union all select 'xyzxyz+Q' from dual)

доводка рашпилем предполагается. совершенно очевидно, что
1) префикс я использовал из трёх букв (насколько сейчас понимаю - вам нужно из четырёх - xyz_ )
2) то, что имеете под термином слово предполагает от конкретики задачи различное толкование.
я трактовал его как (набор символов) \S (A non-whitespace character) если вам надо иное - используйте иное, например
у SY использован (в качестве разделителя) класс \W (A nonword character)

так что - вариантов вам надавали. флаг (и рашпиль;) в руки.. и удачи
17 дек 12, 17:55    [13644820]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить