Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Убрать символы из строки (регулярки)  [new]
kattka
Member

Откуда:
Сообщений: 356
Всем привет!
Есть строка вида "MOW-MSQ-PRG-MSQ-MOW". Задача выбрать города между MOW и MSQ. все остальное удалить.
REGEXP_REPLACE("MOW-MSQ-PRG-MSQ-MOW",'*MOW-|-PRG*','')
результата не дают.
Должно быть MSQ, а выводит MSQ-MSQ.

Подскажите, пожалуйста.
26 авг 13, 16:53    [14756742]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
kattka
Member

Откуда:
Сообщений: 356
Выбрать между MOW и PRG. ошиблась немного
26 авг 13, 16:57    [14756772]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
orawish
Member

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

тут лучше сабстром регулярить
26 авг 13, 17:04    [14756819]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
без регулярки , с учетом того что имена аэропортов или станции (не знаю что там )должны быть 3 символьно.

SQL> create or replace function mybestfunc(p_in varchar2, p_from varchar2, p_to varchar2) return varchar2
  2  is result varchar2(30);
  3  a number;
  4  b number;
  5  s varchar2(30);
  6  begin
  7    s := replace(p_in,'-','');
  8    a := instr(s,p_from)+3;
  9    b := instr(s,p_to,a);
 10    result := substr(s,a,b-a);
 11    return result;
 12  end;
 13  /
Function created

SQL> select mybestfunc('MOW-MSQ-PRG-MSQ-MOW','MSQ','MSQ') from dual;
MYBESTFUNC('MOW-MSQ-PRG-MSQ-MO
--------------------------------------------------------------------------------
PRG

SQL> select mybestfunc('MOW-MSQ-PRG-MSQ-MOW','MOW','PRG') from dual;
MYBESTFUNC('MOW-MSQ-PRG-MSQ-MO
--------------------------------------------------------------------------------
MSQ

SQL> select mybestfunc('MOW-MSQ-PRG-MSQ-MOW','MOW','MOW') from dual;
MYBESTFUNC('MOW-MSQ-PRG-MSQ-MO
--------------------------------------------------------------------------------
MSQPRGMSQ

SQL> 
26 авг 13, 17:09    [14756848]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ну а чтобы понять почему
автор
результата не дают

-выясните для себя, что такое
*
в регулярусной маске
26 авг 13, 17:09    [14756851]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
kattka
Выбрать между MOW и PRG

Если строго между то
SQL> select REGEXP_REPLACE('MOW-MSQ-PRG-MSQ-MOW','.*MOW-(.*)-PRG.*','\1') from dual;
REGEXP_REPLACE('MOW-MSQ-PRG-MS
------------------------------
MSQ

Если нестрого, лучше сабстрить
SQL> select REGEXP_SUBSTR('MOW-MSQ-PRG-MSQ-MOW','MOW-.*-PRG') from dual;
REGEXP_SUBSTR('MOW-MSQ-PRG-MSQ
------------------------------
MOW-MSQ-PRG
26 авг 13, 17:11    [14756860]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
kattka
Member

Откуда:
Сообщений: 356
просто теоретически присутствует возможность что участок MOW-...-PRG в строке может быть не один.
SELECT  substr('MOW-MSQ-MOW-PRG-MSQ-MOW',instr('MOW-MSQ-PRG-MSQ-MOW','MOW',1)+4,instr('MOW-MSQ-PRG-MSQ-MOW','PRG',1)-6)AS marsh FROM dual

Вроде и правильно выводит. Но как-то очень некрасиво смотриться
26 авг 13, 17:11    [14756862]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
kattka
Member

Откуда:
Сообщений: 356
Zloxa
kattka
Выбрать между MOW и PRG

Если строго между то
[src oracle]
SQL> select REGEXP_REPLACE('MOW-MSQ-PRG-MSQ-MOW','.*MOW-(.*)-PRG.*','\1') from dual;
REGEXP_REPLACE('MOW-MSQ-PRG-MS
------------------------------
MSQ

Вот это подошло.
Спасибо за все варианты! отдельная фукнция не подходит, так как данное условие только часть запроса.
Спасибо за внимание и помощь ;-)

П.С. в регулярках не ас конечно, но по-моему символ * означает любое количество символов.
26 авг 13, 17:19    [14756907]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
orawish
Member

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

П.С. в регулярках не ас конечно, но по-моему символ * означает любое количество символов.

отнюдь
26 авг 13, 17:20    [14756915]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Знающие люди, подскажите, это оракл лениться вобще умеет? Вроде где-то вполуха слышал, что делали они ленивую квантификацию. Или же это я их не умею готовить? (Онлайн регеспрепласер, вроде лениво обрезает по этому же регеспу)
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 
Connected as zloxa@orcl01

SQL> select REGEXP_REPLACE('MOW-MSQ-PRG-MSQ-MOW-PRG','.*MOW-(.*?)-PRG.*','\1') from dual;
REGEXP_REPLACE('MOW-MSQ-PRG-MS
------------------------------
MSQ-PRG-MSQ-MOW
26 авг 13, 17:37    [14757028]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Zloxa
Онлайн регеспрепласер, вроде лениво обрезает по этому же регеспу

http://regexr.com?363lf
26 авг 13, 17:38    [14757042]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
Gustly
Member

Откуда:
Сообщений: 1426
* это в принципе обозначает количество (0 и более), а чего смотри на символ левее.
. это любой символ
+ это 1 и более.

Если где ошибаюсь, поправьте пожалуйста.
26 авг 13, 17:42    [14757060]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
orawish
Member

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

в 10.2 жадность умерили
а получить что надо то? это?
select REGEXP_REPLACE('MOW-MSQ-PRG-MSQ-MOW-PRG','^.*?MOW-(.*?)-PRG.*$','\1') 
  from dual;
26 авг 13, 17:50    [14757097]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
orawish
а получить что надо то? это?

Да, думал получить именно это.
Но почему это работает так как показал ты и не работало так, как пробовал я, моему пониманию пока не доступно.
26 авг 13, 17:59    [14757147]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
Gustly
Member

Откуда:
Сообщений: 1426
select REGEXP_REPLACE('MOW-MSQ-PRG-MSQ-MOW','.*MOW-(.*)-PRG.*','\1') 
from dual;
26 авг 13, 17:59    [14757150]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Zloxa
orawish
а получить что надо то? это?

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

ну, отчего же. если после (даже нежадного) искомого следует жадный хвост, то по правилам - (совокупный) результат будет наиболее длинный из возможных
26 авг 13, 18:10    [14757193]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
smotri-sport
Member

Откуда: Смотреть Спорт 1
Сообщений: 1
orawish,
правильно!
26 авг 13, 22:49    [14757981]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
kattka
Member

Откуда:
Сообщений: 356
Всем привет еще раз. Решила не заводить новую тему, может тут подскажите. Просто направьте к правильному решению - есть такая задача: есть строка вида
'851,861,958,584'
, есть вторая строка
'958,851'
(может быть распарсена на отдельные числа). Суть в том что надо составить условие проверки входит ли числа из второй строки в первую. Длина как первой строки так и второй может меняться и быть достаточно длинной. числа из второй строки в первой могут идти в произвольном порядке.

Как вариант решения рассматривала что-то типа
 intstr('851,861,958,584','958')>0 and intstr('851,861,958,584','851')>0

Но так как таких проверок может быть много, то запрос смотрится некрасиво. Может есть какой-то более изящный вариант?
27 авг 13, 10:27    [14758934]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
kattka
Member

Откуда:
Сообщений: 356
*instr лишняя буковка напечаталась ;-)
27 авг 13, 10:32    [14758970]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
orawish
Zloxa
пропущено...

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

ну, отчего же. если после (даже нежадного) искомого следует жадный хвост, то по правилам - (совокупный) результат будет наиболее длинный из возможных


Я не совсем понял твое объяснение, как ни силился. Паттерн тут по всякому матчит всю строку, оба паттерна захватывают строки одинаковой длинны. Единственный жадный квантификатор, который ты оставил - в хвосте. Но так вообще в паттерне у нас используется группа, которая имеет свой паттерн с единственным квантификатором, который ленив, за которым жадный не следует.

В общем и целом, если такое поведение обуславливается описанным тобой и не понятным мною правилом, то, видимо, для жавы это правило не работает.
+ DDL

create or replace and compile java source named javaStringfs as
public class javaStringfs {
    public static String regexpReplace(String val, String pattern, String replacement){
      return val.replaceAll(pattern, replacement);
    }
}
/
create or replace function j_regexp_replace(val varchar2
                                             ,pattern varchar2
                                             ,replacement varchar2
                                             )
                  return varchar2                                             
 as language java
    name 'javaStringfs.regexpReplace(java.lang.String, java.lang.String, java.lang.String) return java.lang.String';
/


SQL> select j_regexp_replace('MOW-MSQ-PRG-MSQ-MOW-PRG','.*MOW-(.*?)-PRG.*','$1') java
  2         ,regexp_replace('MOW-MSQ-PRG-MSQ-MOW-PRG','.*MOW-(.*?)-PRG.*','\1') ora
  3  from dual
  4  /
JAVA                    ORA
----------------------- ---------------
MSQ                     MSQ-PRG-MSQ-MOW


Увы, все таки это больше похоже "особенности реализации" ((
27 авг 13, 10:56    [14759144]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
-2-
Member

Откуда:
Сообщений: 15330
kattka
Может есть какой-то более изящный вариант?
Числа в списках уникальные? regexp_count или submultiset of
27 авг 13, 10:58    [14759153]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
kattka
Member

Откуда:
Сообщений: 356
В первой строке не уникальны. возможны повторения. во втором списке уникальны. мне подходит и такой вариант - если хотя бы одно из чисел из второго списка есть в первом. но лучше если есть все числа из второго списка
27 авг 13, 11:01    [14759175]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
kattka
Как вариант решения рассматривала что-то типа
 intstr('851,861,958,584','958')>0 and intstr('851,861,958,584','851')>0


Все числа строго трехзначны?
Если нет, следовало бы делать как-то так
 intstr(','||'851,861,958,584'||','
        ,','||'958'||','
        )>0 
27 авг 13, 11:09    [14759245]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
SQL> create or replace type mytab_t as table of varchar2(4000)
  2  /
 
Type created
 
SQL> with d as (
  2  select '851,861,958,584' a, '958,851' b from dual
  3  ),
  4  a as (
  5  select cast(collect(regexp_substr(a, '\d+', 1, level)) as mytab_t) x from d connect by level <= regexp_count(a, '\d+')
  6  ),
  7  b as (
  8  select cast(collect(regexp_substr(b, '\d+', 1, level)) as mytab_t) x from d connect by level <= regexp_count(b, '\d+')
  9  )
 10  select nvl(max('yes'), 'no') from a, b where b.x submultiset a.x
 11  /
 
NVL(MAX('YES'),'NO')
--------------------
yes
 
SQL> with d as (
  2  select '851,861,958,584' a, '958,852' b from dual
  3  ),
  4  a as (
  5  select cast(collect(regexp_substr(a, '\d+', 1, level)) as mytab_t) x from d connect by level <= regexp_count(a, '\d+')
  6  ),
  7  b as (
  8  select cast(collect(regexp_substr(b, '\d+', 1, level)) as mytab_t) x from d connect by level <= regexp_count(b, '\d+')
  9  )
 10  select nvl(max('yes'), 'no') from a, b where b.x submultiset a.x
 11  /
 
NVL(MAX('YES'),'NO')
--------------------
no
 
SQL> 
27 авг 13, 11:29    [14759358]     Ответить | Цитировать Сообщить модератору
 Re: Убрать символы из строки (регулярки)  [new]
kattka
Member

Откуда:
Сообщений: 356
bdsm_sql

Спасибо конечно, но как-то объемно и непонятно.

Zloxa, числа трех-четырех значные.
intstr(','||'851,861,958,584'||',',','||'958'||',')>0 

если не трудно, немного комментариев относительно ||',', пожалуйста.
27 авг 13, 11:33    [14759384]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить