Raz na jakiś czas zachodzi potrzeba wyszukania w bazie danych w określonym formacie. Często wystarcza do tego celu zwykłe LIKE, jednak konstrukcja taka nie pomoże w bardziej skomplikowanych przypadkach. Wtedy warto skorzystać z REGEXP, dzięki czemu wykorzystamy możliwości wyrażeń regularnych.
Podstawowym sposobem na wyszukiwania według określonego formatu jest w MySQL konstrukcja LIKE. Możemy w niej skorzystać z następujących konstrukcji:
- _ – każdy pojedynczy znak
- % – wiele dowolnych znaków (włączając w to ich brak)
Przykładowe zapytanie:
select x from tabela where y like "a_cd%h";
zwróci wszystkie rekordy, dla których kolumna “x” rozpoczyna się od znaku „a”, po którym występuje jeden dowolny znak, następnie ciąg „cd”, nieokreślona liczba dowolnych znaków i na końcu znak „h”.
Takie wyszukiwania są jednak mocno ograniczone, często potrzebujemy wyboru bardziej szczegółowego formatu. Z pomocą mogą tu przyjść wyrażenia regularne, z którym możemy korzystać w MySQL poprzez konstrukcje REGEXP oraz NOT REGEXP (lub ich synonimy RLIKE oraz NOT RLIKE). W MySQL obowiązuje format Perla, czyli na przykład:
select * from tabela where pole regexp '^[a-c]{1,3}X[0-9]*';
Wyrażenia regularne w MySQL mogą zawierać następujące konstrukcje:
- ^ – wyrażanie regularne rozpoczyna się od zdefiniowanego wzorca, np. ^x oznacza dowolny ciąg zaczynający się od znaku „x”
- $ – wyrażanie regularne kończy się na zdefiniowanym wzorcu, np. x$ oznacza dowolny ciąg kończący się znakiem „x”
- . – dowolny pojedynczy znak
- * – zero lub więcej znaków, po jakim została umieszczona gwiazdka, np. x* oznacza dowolną liczbę wystąpień litery „x”, [0-9]* oznacza dowolną liczbę wystąpień jakiejkolwiek cyfry, (abc)* dowolną liczbę wystąpień ciągu „abc”, natomiast .* dowolny ciąg znaków
- + – jedno lub więcej wystąpienie określonego ciągu po jakim został umieszczony +, np. x+ oznacza jeden lub więcej „x”, [a-c]+ oznacza jedną lub więcej literę a, b lub c
- ? – zero lub jedno wystąpienie poprzedzającego znaku, np. x? oznacz zero lub jedno wystąpienie znaku „x”
- [..] – zakres znaków, np. [a-zA-GXYZ5-9] oznacza wszystkie małe litery, duże od A do G oraz X, Y, Z, cyfry od 5-9. Można stosować zaprzeczenie poprzez ^, np. [^3-5] oznacza wszystkie ciągi, które nie zawierają liczb 3, 4 oraz 5.
- | – logiczne lub, np. abc|def oznacza ciąg abc lub def
- {n}, {n, m} – określa liczbę wystąpień poprzedzającego wyrażenia, np. a{4} oznacza znak „a” występujący dokładnie 4 razy, [a-c]{2,3} oznacza znak a, b lub c występujący od 2 do 3 razy. Można także stosować konstrukcję {0,}, która jest tożsama z operatorem * oraz {1,}, który oznacza to samo co +
Aby użyć znaku specjalnego (+, -, *, &, itp) musimy posłużyć się podwójnymi slashami. Przykładowo, aby odnaleźć ciąg 1+2 należy zastosować wyrażenie regularne w postaci 1\\+2.
Znaki w wyrażaniach regularnych możemy pisać wprost ([abc], \\+, \\’ itp.) lub stosując specjalną konstrukcję w postaci [.znaki.] . Przykładowo, aby znaleźć ciągi zawierające tyldę możemy posłużyć się zapytaniami:
SELECT x FROM tabela REGEXP '\\~'; SELECT x FROM tabela REGEXP '[[.~.]]'; SELECT x FROM tabela REGEXP '[[.tilde.]]';
Tego typu zapisów jest dość sporo, przykładowe to:
- newline – nowa linia \n
- tab – tabulacja \t
- apostrophe – pojedynczy apostrof ‚
- carriage-return – znak powrotu karetki \r
- plus-sign – znak „plus” +
Można także stosować klasy znaków, zawierające okresloną grupę wzorców. Na przykład [:alnum:] oznacza wszystkie znaki alfanumeryczne. Inne możliwości są następujące:
- alnum – znaki alfanumeryczne
- alpha – litery alfabetu
- blank – białe znaki
- cntrl – znaki kontrolne
- digit – cyfry
- graph – znaki graficzne
- lower – małe litery alfabetu
- print – znaki graficzne lub spacje
- punct – znaki interpunkcyjne
- space – spacja, tabulacja, znak nowej linii oraz powrotu karetki
- upper – duże litery alfabetu
- xdigit – znaki heksadecymalne