W MySQL REGEXP
Operator służy do określenia, czy ciąg pasuje do wyrażenia regularnego. To synonim wyrażenia REGEXP_LIKE()
.
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, względem którego testujesz ciąg.
Przykład 1 – Podstawowe wyrażenie regularne
Najbardziej podstawowe 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 | +------+-------+--------+--------+
Przykład 2 – 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 | +------+-------+--------+
Przykład 3 – 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 | +------+-------+--------+
Przykład 4 – Dopasuj dowolny znak
.
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.
Przykład 5 – Dopasuj zero lub więcej wystąpień określonego znaku
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.
Przykład 6 – Dopasuj jedno lub więcej wystąpień 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.
Przykład 7 – 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 | +------+-------+--------+-----+------+-------+-------+
Przykład 8 – Naprzemienne
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.
Przykład 9 – 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 | +--------+------+------+-----+
Przykład 10 – 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 | +--------+-------+
Przykład 11 – Zasięg
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:
+--------+-------+ | Tweeet | Tweet | +--------+-------+ | 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 | +-----+-----+-----+
Przykład 12 – Poza zakresem
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 | +-----+-----+-----+
Otrzymujemy więc wynik odwrotny do poprzedniego przykładu.