Wyrażenia regularne w MySQL

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

Dodaj komentarz