W MariaDB REGEXP
Operator jest używany do określenia, czy łańcuch pasuje do wyrażenia regularnego.
Jeśli ciąg pasuje do podanego wyrażenia regularnego, wynikiem jest 1
, w przeciwnym razie jest to 0
.
Składnia
Składnia wygląda tak:
expr REGEXP pat
Gdzie expr
jest ciągiem wejściowym i pat
jest wyrażeniem regularnym, dla którego testujesz ciąg.
Przykłady
Poniżej znajdują się przykłady użycia REGEXP
operator z różnymi wzorami.
Podstawowe wyrażenie regularne
Zacznijmy od najprostszego przykładu. Najprostsze wyrażenie regularne, którego możemy użyć, to takie, które nie zawiera znaków specjalnych. Tutaj po prostu używamy ciągu. Jeśli jakakolwiek część ciągu wejściowego pasuje do tego ciągu, zwraca dopasowanie.
SELECT
'Corn' REGEXP 'Corn' AS "Corn",
'Acorn' REGEXP 'Corn' AS "Acorn",
'Corner' REGEXP 'Corn' AS "Corner",
'Cheese' REGEXP 'Corn' AS "Cheese";
Wynik:
+------+-------+--------+--------+ | Corn | Acorn | Corner | Cheese | +------+-------+--------+--------+ | 1 | 1 | 1 | 0 | +------+-------+--------+--------+
Dopasuj początek ciągu
W tym przykładzie wyrażenie regularne określa, że ciąg musi zaczynać się od Co
.
SELECT
'Corn' REGEXP '^Co' AS "Corn",
'Acorn' REGEXP '^Co' AS "Acorn",
'Cheese' REGEXP '^Co' AS "Cheese";
Wynik:
+------+-------+--------+ | Corn | Acorn | Cheese | +------+-------+--------+ | 1 | 0 | 0 | +------+-------+--------+
Dopasuj koniec ciągu
W tym przykładzie wyrażenie regularne określa, że ciąg musi kończyć się rn
.
SELECT
'Corn' REGEXP 'rn$' AS "Corn",
'Acorn' REGEXP 'rn$' AS "Acorn",
'Cheese' REGEXP 'rn$' AS "Cheese";
Wynik:
+------+-------+--------+ | Corn | Acorn | Cheese | +------+-------+--------+ | 1 | 1 | 0 | +------+-------+--------+
Dopasuj dowolną postać
.
znak pasuje do dowolnego znaku.
SELECT
'Corn' REGEXP '.' AS "Corn",
'Cheese' REGEXP '.' AS "Cheese",
'' REGEXP '.' AS "";
Wynik:
+------+--------+---+ | Corn | Cheese | | +------+--------+---+ | 1 | 1 | 0 | +------+--------+---+
Ten znak jest zwykle używany w połączeniu z innymi znakami w celu określenia dalszych kryteriów. Na przykład:
SELECT
'Corn' REGEXP '^C.rn$' AS "Corn",
'Crn' REGEXP '^C.rn$' AS "Crn";
Wynik:
+------+-----+ | Corn | Crn | +------+-----+ | 1 | 0 | +------+-----+
Tutaj określamy, że ciąg musi zaczynać się od C
, że musi następować po nim znak (dowolny znak) i że musi kończyć się rn
.
Zauważ, że ten znak określa pojedynczą instancję znaku. Jeśli chcesz określić wiele instancji (na przykład ee
zamiast po prostu e
), musisz dodać więcej .
znaków.
SELECT
'Tweet' REGEXP '^Tw..t$' AS "Tweet",
'Tweat' REGEXP '^Tw..t$' AS "Tweat",
'Tweet' REGEXP '^Tw.t$' AS "Tweet",
'Twit' REGEXP '^Tw..t$' AS "Twit";
Wynik:
+-------+-------+-------+------+ | Tweet | Tweat | Tweet | Twit | +-------+-------+-------+------+ | 1 | 1 | 0 | 0 | +-------+-------+-------+------+
Innym sposobem na to jest określenie liczby wystąpień w nawiasach klamrowych:
SELECT
'Tweet' REGEXP '^Tw.{2}t$' AS "Tweet",
'Tweat' REGEXP '^Tw.{2}t$' AS "Tweat",
'Tweet' REGEXP '^Tw.{1}t$' AS "Tweet",
'Twit' REGEXP '^Tw.{2}t$' AS "Twit";
Wynik:
+-------+-------+-------+------+ | Tweet | Tweat | Tweet | Twit | +-------+-------+-------+------+ | 1 | 1 | 0 | 0 | +-------+-------+-------+------+
Jeśli jednak znasz znak, którego szukasz, możesz określić ten znak (zamiast .
znak), jak pokazano w poniższym przykładzie.
Dopasuj zero lub więcej wystąpień określonej postaci
Możemy wykonać następujące czynności, aby określić zero lub więcej wystąpień e
charakter:
SELECT
'Twet' REGEXP '^Twe*t$' AS "Twet",
'Tweet' REGEXP '^Twe*t$' AS "Tweet",
'Tweeet' REGEXP '^Twe*t$' AS "Tweeet",
'Twt' REGEXP '^Twe*t$' AS "Twt",
'Twit' REGEXP '^Twe*t$' AS "Twit",
'Twiet' REGEXP '^Twe*t$' AS "Twiet",
'Tweit' REGEXP '^Twe*t$' AS "Tweit";
Wynik:
+------+-------+--------+-----+------+-------+-------+ | Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit | +------+-------+--------+-----+------+-------+-------+ | 1 | 1 | 1 | 1 | 0 | 0 | 0 | +------+-------+--------+-----+------+-------+-------+
Pierwsze cztery pasują, ale ostatnie trzy nie.
Dopasuj jedną lub więcej instancji określonej postaci
Możemy zmodyfikować poprzedni przykład tak, że otrzymamy dopasowanie tylko wtedy, gdy jeden znaleziono lub więcej znaków (poprzedni przykład zwrócił dopasowanie, jeśli zero lub więcej). Aby to zrobić, po prostu używamy +
zamiast *
:
SELECT
'Twet' REGEXP '^Twe+t$' AS "Twet",
'Tweet' REGEXP '^Twe+t$' AS "Tweet",
'Tweeet' REGEXP '^Twe+t$' AS "Tweeet",
'Twt' REGEXP '^Twe+t$' AS "Twt",
'Twit' REGEXP '^Twe+t$' AS "Twit",
'Twiet' REGEXP '^Twe+t$' AS "Twiet",
'Tweit' REGEXP '^Twe+t$' AS "Tweit";
Wynik:
+------+-------+--------+-----+------+-------+-------+ | Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit | +------+-------+--------+-----+------+-------+-------+ | 1 | 1 | 1 | 0 | 0 | 0 | 0 | +------+-------+--------+-----+------+-------+-------+
W takim przypadku czwarte słowo zwraca inny wynik niż w poprzednim przykładzie.
Dopasuj zero lub jedno wystąpienie określonej postaci
Możemy zmodyfikować poprzedni przykład tak, że otrzymamy dopasowanie tylko dla zera lub jednego z żądanych znaków. Aby to zrobić, używamy ?
:
SELECT
'Twet' REGEXP '^Twe?t$' AS "Twet",
'Tweet' REGEXP '^Twe?t$' AS "Tweet",
'Tweeet' REGEXP '^Twe?t$' AS "Tweeet",
'Twt' REGEXP '^Twe?t$' AS "Twt",
'Twit' REGEXP '^Twe?t$' AS "Twit",
'Twiet' REGEXP '^Twe?t$' AS "Twiet",
'Tweit' REGEXP '^Twe?t$' AS "Tweit";
Wynik:
+------+-------+--------+-----+------+-------+-------+ | Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit | +------+-------+--------+-----+------+-------+-------+ | 1 | 0 | 0 | 1 | 0 | 0 | 0 | +------+-------+--------+-----+------+-------+-------+
Zmiana
Możesz użyć |
znak pasujący do jednego lub drugiego ciągu znaków:
SELECT
'Tweet' REGEXP 'Tw|et' AS "Tweet",
'For Let' REGEXP 'Tw|et' AS "For Let",
'Banana' REGEXP 'Tw|et' AS "Banana";
Wynik:
+-------+---------+--------+ | Tweet | For Let | Banana | +-------+---------+--------+ | 1 | 1 | 0 | +-------+---------+--------+
Oto kolejny przykład, w którym wyszukuję całe słowa:
SELECT
'Cat' REGEXP 'Cat|Dog' AS "Cat",
'Dog' REGEXP 'Cat|Dog' AS "Dog",
'Doggone' REGEXP 'Cat|Dog' AS "Doggone",
'Banana' REGEXP 'Cat|Dog' AS "Banana";
Wynik:
+-----+-----+---------+--------+ | Cat | Dog | Doggone | Banana | +-----+-----+---------+--------+ | 1 | 1 | 1 | 0 | +-----+-----+---------+--------+
Nadal otrzymujemy dopasowanie, nawet jeśli nasze wyrażenie regularne pasuje tylko do części ciągu.
Dopasuj zero lub więcej wystąpień sekwencji
Możesz używać nawiasów wraz z gwiazdką ()*
aby określić zero lub więcej wystąpień sekwencji:
SELECT
'Banana' REGEXP '(an)*' AS "Banana",
'Land' REGEXP '(an)*' AS "Land",
'Cheese' REGEXP '(an)*' AS "Cheese";
Wynik:
+--------+------+--------+ | Banana | Land | Cheese | +--------+------+--------+ | 1 | 1 | 1 | +--------+------+--------+
Inny przykład:
SELECT
'Banana' REGEXP '^B(an)*d$' AS "Banana",
'Band' REGEXP '^B(an)*d$' AS "Band",
'Bald' REGEXP '^B(an)*d$' AS "Bald",
'Bad' REGEXP '^B(an)*d$' AS "Bad";
Wynik:
+--------+------+------+-----+ | Banana | Band | Bald | Bad | +--------+------+------+-----+ | 0 | 1 | 0 | 0 | +--------+------+------+-----+
Powtórzenie
Jak widać w poprzednim przykładzie, możesz użyć nawiasów klamrowych, aby określić powtórzenie. Ta notacja zapewnia bardziej ogólny sposób pisania wyrażeń regularnych niż niektóre z poprzednich przykładów:
SELECT
'Tweeet' REGEXP 'e{3}' AS "Tweeet",
'Tweet' REGEXP 'e{3}' AS "Tweet";
Wynik:
+--------+-------+ | Tweeet | Tweet | +--------+-------+ | 1 | 0 | +--------+-------+
Zakres
Do określenia zakresu można użyć łącznika. Oto przykład określający zakres liczb:
SELECT
'Tweet 123' REGEXP '[0-9]' AS "Tweet 123",
'Tweet ABC' REGEXP '[0-9]' AS "Tweet ABC";
Wynik:
+--------+-------+ | Tweeet | Tweet | +--------+-------+ | 1 | 0 | +--------+-------+
Poniższy przykład określa zakres liter:
SELECT
'Tweet 123' REGEXP '[A-Z]' AS "Tweet 123",
'ABC' REGEXP '[A-Z]' AS "ABC",
'123' REGEXP '[A-Z]' AS "123";
Wynik:
+-----------+-----+-----+ | Tweet 123 | ABC | 123 | +-----------+-----+-----+ | 1 | 1 | 0 | +-----------+-----+-----+
Oto, co się stanie, jeśli ograniczymy zakres liczb:
SELECT
'123' REGEXP '[1-3]' AS "123",
'012' REGEXP '[1-3]' AS "012",
'045' REGEXP '[1-3]' AS "045";
Wynik:
+-----+-----+-----+ | 123 | 012 | 045 | +-----+-----+-----+ | 1 | 1 | 0 | +-----+-----+-----+
Nie w zasięgu
Możemy użyć ^
znak, aby zmodyfikować poprzedni przykład, aby wykluczyć określony zakres znaków:
SELECT
'123' REGEXP '[^1-3]' AS "123",
'012' REGEXP '[^1-3]' AS "012",
'045' REGEXP '[^1-3]' AS "045";
Wynik:
+-----+-----+-----+ | 123 | 012 | 045 | +-----+-----+-----+ | 0 | 1 | 1 | +-----+-----+-----+
W tym przypadku otrzymujemy wynik odwrotny do poprzedniego przykładu.
Wartości puste
Jeśli wyrażenie lub wzorzec ma wartość null
, wynik to null
:
SELECT
null REGEXP 'Corn' AS "Corn",
'Acorn' REGEXP null AS "Acorn",
null REGEXP null AS "Corner";
Wynik:
+------+-------+--------+ | Corn | Acorn | Corner | +------+-------+--------+ | NULL | NULL | NULL | +------+-------+--------+