Prawdziwy programista wiesza się razem ze swoim programem...
Regular Expressions

Opis składni wyrażeń regularnych w MySQL

Wyrażenia regularne (regex) są potężnym narzędziem przydatnym przy złożonym wyszukiwaniu. Tutaj znajdziesz tylko dość uproszczony przewodnik pomijający większość szczegółów.

Wyrażenie regularne opisuje zestaw znaków. Najprostszym wyrażeniem regularnym jest takie, które nie zawiera w sobie żadnych znaków specjalnych. Na przykład, wyrażenie regularne (dalej nazywane regexp) witaj będzie dopasowane tylko do ciągu znaków witaj i do niczego innego.

Jednak zazwyczaj wyrażenia regularne używają pewnych specjalnych konstrukcji, dzięki czemu mogą być dopasowane do więcej niż jednego ciągu znaków. Na przykład, wyrażenie regularne witaj|świecie będzie dopasowane zarówno do łańcucha witaj jak i do świecie.

Jeszcze bardziej skomplikowanym przykładem jest wyrażenie B[an]*y, które zostanie dopasowane do każdego z następujących ciągów znaków: Banany, Bay, By i innych rozpoczynających się literą B, kończących literą s i zawierających dowolną ilość (również zero) znaków a lub n w środku.

Konstruując wyrażenia regularne można korzystać z poniższych znaków specjalnych:

^
Dopasowuje szablon do początku łańcucha:
   SELECT 'fo\nfo' REGEXP '^fo$';                   -> 0
   SELECT 'fofo' REGEXP '^fo';                      -> 1
$
Dopasowuje szablon do końca łańcucha:
   SELECT 'fo\no' REGEXP '^fo\no$';                 -> 1
   SELECT 'fo\no' REGEXP '^fo$';                    -> 0
.
Dopasowuje do dowolnego znaku (włącznie ze znakiem nowego wiersza):
   SELECT 'fofo' REGEXP '^f.*$';                    -> 1
   SELECT 'fo\r\nfo' REGEXP '^f.*$';                -> 1
a*
Dopasowuje do każdej ilości (zero lub więcej) znaków a:
   SELECT 'Ban'   REGEXP '^Ba*n';           -> 1
   SELECT 'Baaan' REGEXP '^Ba*n';           -> 1
   SELECT 'Bn'    REGEXP '^Ba*n';           -> 1
a+
Dopasowuje do jednego lub więcej znaków a:
   SELECT 'Ban' REGEXP '^Ba+n';             -> 1
   SELECT 'Bn'  REGEXP '^Ba+n';             -> 0
a?
Dopasowuje do zera lub jednego znaku a:
   SELECT 'Bn'   REGEXP '^Ba?n';            -> 1
   SELECT 'Ban'  REGEXP '^Ba?n';            -> 1
   SELECT 'Baan' REGEXP '^Ba?n';            -> 0
de|abc
Dopasowuje do sekwencji znaków de lub abc:
   SELECT 'pi'  REGEXP 'pi|apa';            -> 1
   SELECT 'axe' REGEXP 'pi|apa';            -> 0
   SELECT 'apa' REGEXP 'pi|apa';            -> 1
   SELECT 'apa' REGEXP '^(pi|apa)$';        -> 1
   SELECT 'pi'  REGEXP '^(pi|apa)$';        -> 1
   SELECT 'pix' REGEXP '^(pi|apa)$';        -> 0
(abc)*
Dopasowuje do zera lub większej ilości wystąpienia sekwencji znaków abc:
   SELECT 'pi'   REGEXP '^(pi)*$';          -> 1
   SELECT 'pip'  REGEXP '^(pi)*$';          -> 0
   SELECT 'pipi' REGEXP '^(pi)*$';          -> 1
{1}
{2,3}
Jest to bardziej ogólny sposób pisania wyrażeń regularnych które zostają dopasowane do wielu wystąpień wcześniej podanego wyrażenia:
a*
może być zapisany jako a{0,}.
a+
może być zapisany jako a{1,}.
a?
może być zapisany jako a{0,1}.
Dokładniej: część po której następuje nawias klamrowy zawierający jedną liczbę całkowitą i bez przecinka zostanie dopasowany do dokładnie i wystąpień danego wyrażenia. Część, po której następuje jedna liczba całkowita i i przecinek zostanie dopasowana do sekwencji i lub więcej wystąpienia danego wyrażenia. Część, po której następuje nawias klamrowy z dwiema liczbami i i j zostanie dopasowana do sekwencji od i do j (włącznie) wystąpień wyrażenia. Oba argumenty muszą spełniać nierówność 0 >= wartość <= 255. Jeśli występują dwa argumenty, to drugi musi być równy pierwszemu lub większy.
   SELECT 'abcde' REGEXP 'a[bcd]{2}e';              -> 0
   SELECT 'abcde' REGEXP 'a[bcd]{3}e';              -> 1
   SELECT 'abcde' REGEXP 'a[bcd]{1,10}e';           -> 1
[a-dX]
[^a-dX]
Zostaje dopasowane do każdego znaku, który jest (lub nie jest w przypadku ^) a, b, c, d lub X. Jeżeli w łańcuchu występuje znak ], to musi być zapisany zaraz za otwierającym nawiasem [. Znak - musi wystąpić na początku lub na końcu literału, bo np. zapis [0-9] oznacza dowolna cyfrę dziesiętna. Każdy inny znak nie zdefiniowany wewnątrz pary [] nie ma specjalnego znaczenie i zostanie dopasowany jedynie do siebie samego.
   SELECT 'aXbc' REGEXP '[a-dXYZ]';                 -> 1
   SELECT 'aXbc' REGEXP '^[a-dXYZ]$';               -> 0
   SELECT 'aXbc' REGEXP '^[a-dXYZ]+$';              -> 1
   SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$';             -> 0
   SELECT 'gheis' REGEXP '^[^a-dXYZ]+$';            -> 1
   SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$';           -> 0
[.znak.]
Wewnątrz nawiasów kwadratowych odpowiada dowolnej ilości znaku. Znak można podać wprost lub przez nazwę.
   SELECT '~' REGEXP '[[.~.]]';                     -> 1
   SELECT '~' REGEXP '[[.tilde.]]';                 -> 1
[:klasa_znaków:]
Reprezentuje dowolny znak z podanej klasy. Standardowe nazwy klas to:
 
   SELECT 'justalnums' REGEXP '[[:alnum:]]+';       -> 1
   SELECT '!!' REGEXP '[[:alnum:]]+';               -> 0
[[:<:]] , [[:>:]]
Porównanie całych wyrazów: ciągów liter rozpoczynających się lub zakończonych innym znakiem.
   SELECT 'a wyraz a' REGEXP '[[:<:]]wyraz[[:>:]]';   -> 1
   SELECT 'a Xwyraz a' REGEXP '[[:<:]]wyraz[[:>:]]';  -> 0
   SELECT 'a wyrazX a' REGEXP '[[:<:]]wyraz[[:>:]]';  -> 0
« wstecz   dalej »