Discussion:
regexp_like oracle
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Jakub Owczarski
2011-04-05 10:41:36 UTC
Permalink
Witam.
Mam string który powinien podlegać następującym regułom:
*tylko znaki alfanumeryczne lub minus
*minus jedynie pomiędzy cyframi.
Chciałem odszukać wszystkie nieprawidłowe stringi S w tabeli T
Wyrzeźbiłem takie zapytanie:

SELECT * FROM T WHERE NOT REGEXP_LIKE(S,'([[:alnum:]]+)|
([[:alnum:]]*[[:digit:]]+-[[:digit:]]+[[:alnum:]]*)')

W moim przekonaniu powinno zwrócić wszystkie nieprawidłowe stringi.
Nie jestem za mocny w regexp. więc może wytłumaczę co miałem na myśli,
żeby ktoś mógł mnie poprawić:
([[:alnum:]]+) - string składający się z przynajmniej jedego znaku
alfanumerycznego
ALBO
([[:alnum:]]*[[:digit:]]+-[[:digit:]]+[[:alnum:]]*) - dowolna liczba
znaków alfanumerycznych, potem conajmniej jedna cyfra, potem minus,
potem conajmniej jedna cyfra i dowolna liczba znaków alfanumerycznych.

Jednak coś poszło nie tak, bo zapytanie nie zwraca żadnych wyników,
ale kiedy zapytam np:
SELECT * FROM T WHERE S LIKE '%-' DOSTAŁEM
'ABC123-'
Które nie jest dozwolone(minus może być tylko między cyframi)

Bardzo proszę o jakąś podpowiedź co robię źle.
TIA
pzdr.
Jakub.
\\n
2011-04-05 11:07:32 UTC
Permalink
Post by Jakub Owczarski
Witam.
*tylko znaki alfanumeryczne lub minus
*minus jedynie pomiędzy cyframi.
Chciałem odszukać wszystkie nieprawidłowe stringi S w tabeli T
SELECT * FROM T WHERE NOT REGEXP_LIKE(S,'([[:alnum:]]+)|
([[:alnum:]]*[[:digit:]]+-[[:digit:]]+[[:alnum:]]*)')
W moim przekonaniu powinno zwrócić wszystkie nieprawidłowe stringi.
Dzięki temu co przed "|" warunek nie będzie spełniony dla każdego ciągu
zawierającego choćby jeden [:alnum:]
--
Panie, zachowaj mnie od zgubnego nawyku mniemania,
że muszę coś powiedzieć na każdy temat i przy każdej okazji.
Odbierz mi chęć prostowania każdemu jego ścieżek.
Jakub Owczarski
2011-04-05 11:52:21 UTC
Permalink
Post by \\n
Post by Jakub Owczarski
SELECT * FROM T WHERE NOT REGEXP_LIKE(S,'([[:alnum:]]+)|
([[:alnum:]]*[[:digit:]]+-[[:digit:]]+[[:alnum:]]*)')
Dzięki temu co przed "|" warunek nie będzie spełniony dla każdego ciągu
zawierającego choćby jeden [:alnum:]
Właściwie to ja chyba zupełnie coś pomieszałem, bo zapytanie:
SELECT S FROM T WHERE NOT REGEXP_LIKE(S,'^[[:alnum:]]*[[:digit:]]+-
[[:digit:]]+[[:alnum:]]*$')
Zwraca mi na przykład:

63100-840-010-0
125-099-9
G6352-36-1

Które wg moich założeń powinny być wykluczone w wyniku zapytania.
Co jest nie tak?
pzdr.
Mariusz Kruk
2011-04-05 12:03:06 UTC
Permalink
epsilon$ while read LINE; do echo \>"$LINE"; done < "Jakub Owczarski"
Post by Jakub Owczarski
SELECT S FROM T WHERE NOT REGEXP_LIKE(S,'^[[:alnum:]]*[[:digit:]]+-
[[:digit:]]+[[:alnum:]]*$')
63100-840-010-0
125-099-9
G6352-36-1
I dobrze zwraca.
Post by Jakub Owczarski
Które wg moich założeń powinny być wykluczone w wyniku zapytania.
Co jest nie tak?
Regexp jest nie tak. Albo oczekiwania są nie tak ;-)
W obecnej chwili pod regexp łapią się jedynie ciągi, w których jest
jeden minus.
Musiałbyś zrobić coś w stylu ^([[:alnum:]]|[[:digit:]]-[[:digit:]])*$
--
\------------------------/
| ***@epsilon.eu.org | http://www.nieruchomosci.pl/mieszkanie,58342761
| http://epsilon.eu.org/ |
/------------------------\
Jakub Owczarski
2011-04-05 13:12:28 UTC
Permalink
Regexp jest nie tak. Albo oczekiwania s nie tak ;-)
W obecnej chwili pod regexp api si jedynie ci gi, w kt rych jest
jeden minus.
Fakt, minusów może być dużo.
Musia by zrobi co w stylu ^([[:alnum:]]|[[:digit:]]-[[:digit:]])*$
Jeżeli dobrze to rozumiem to znaczy: string składający się z [(string
alfanumeryczny) lub (cyfra minus cyfra)] powtórzone dowolną ilość razy
Więc dlaczego nie łapie stringów w których jest jedna cyfra między
minusami.
np:
127558-1-1
601T6-7-16X028
M8328-2-905

Dzięki za cierpliwość
pzdr.
Mariusz Kruk
2011-04-05 13:28:43 UTC
Permalink
epsilon$ while read LINE; do echo \>"$LINE"; done < "Jakub Owczarski"
Post by Jakub Owczarski
Musia by zrobi co w stylu ^([[:alnum:]]|[[:digit:]]-[[:digit:]])*$
Jeżeli dobrze to rozumiem to znaczy: string składający się z [(string
alfanumeryczny) lub (cyfra minus cyfra)] powtórzone dowolną ilość razy
Więc dlaczego nie łapie stringów w których jest jedna cyfra między
minusami.
127558-1-1
601T6-7-16X028
M8328-2-905
No tak. Zapomniałem o tej możliwości. Nie złapie się, ponieważ po
cyfra-cyfra dostaniesz minusa, a nie którąkolwiek z możliwości.
Trzeba pewnie zamienić prawą część na [[:digit:]](-[[:digit:]])*
Wtedy lewą można na [[:alpha:]] (alnum mógłby zostać, ale będzie lekko
redundantny).
--
\------------------------/
| ***@epsilon.eu.org | http://www.nieruchomosci.pl/mieszkanie,58342761
| http://epsilon.eu.org/ |
/------------------------\
Jakub Owczarski
2011-04-05 13:57:57 UTC
Permalink
Post by Mariusz Kruk
No tak. Zapomniałem o tej możliwości. Nie złapie się, ponieważ po
cyfra-cyfra dostaniesz minusa, a nie którąkolwiek z możliwości.
Trzeba pewnie zamienić prawą część na [[:digit:]](-[[:digit:]])*
Wtedy lewą można na [[:alpha:]] (alnum mógłby zostać, ale będzie lekko
redundantny).
Makes sense.
Dzięki.

pzdr.

A.L.E.C
2011-04-05 12:04:45 UTC
Permalink
Post by Jakub Owczarski
SELECT S FROM T WHERE NOT REGEXP_LIKE(S,'^[[:alnum:]]*[[:digit:]]+-
[[:digit:]]+[[:alnum:]]*$')
63100-840-010-0
125-099-9
G6352-36-1
No tutaj akurat zwraca prawidłowe wyniki. Twój regexp pozwala na tylko
jeden minus, a skoro jest NOT, więc wszystko ok.
--
Aleksander 'A.L.E.C' Machniak
LAN Management System Developer [http://lms.org.pl]
Roundcube Webmail Developer [http://roundcube.net]
---------------------------------------------------
PGP: 19359DC1 @@ GG: 2275252 @@ WWW: http://alec.pl
A.L.E.C
2011-04-05 11:36:32 UTC
Permalink
Post by Jakub Owczarski
*tylko znaki alfanumeryczne lub minus
*minus jedynie pomiędzy cyframi.
Chciałem odszukać wszystkie nieprawidłowe stringi S w tabeli T
SELECT * FROM T WHERE NOT REGEXP_LIKE(S,'([[:alnum:]]+)|
([[:alnum:]]*[[:digit:]]+-[[:digit:]]+[[:alnum:]]*)')
Nie znam oracle ale chyba zapomniałeś o znakach początku i końca, czyli
pewnie:

'^([[:alnum:]]+)|([[:alnum:]]*[[:digit:]]+-[[:digit:]]+[[:alnum:]]*)$'
--
Aleksander 'A.L.E.C' Machniak
LAN Management System Developer [http://lms.org.pl]
Roundcube Webmail Developer [http://roundcube.net]
---------------------------------------------------
PGP: 19359DC1 @@ GG: 2275252 @@ WWW: http://alec.pl
Jakub Owczarski
2011-04-05 11:45:42 UTC
Permalink
Nie znam oracle ale chyba zapomnia e o znakach pocz tku i ko ca, czyli
'^([[:alnum:]]+)|([[:alnum:]]*[[:digit:]]+-[[:digit:]]+[[:alnum:]]*)$'
:-] tak miałem w orginale, po prostu puźniej zacząłem kombinować "na
pałę" i jakoś tak wkleiłem bez ograniczników.
W każdym razie to zapytanie nic nie zwraca pomimo istnienia
wspomnianego rekordu.

dzięki pzdr.
Loading...