MySQL posiada szereg funkcji i operatorów, które pozwalają nam wykonywać operacje za pomocą wyrażeń regularnych (regex). Ten artykuł przedstawia dwa operatory i jedną funkcję, które pozwalają nam dowiedzieć się, czy ciąg znaków pasuje do wyrażenia regularnego określonego przez dany wzorzec.
Te funkcje i operatory wyrażeń regularnych to:
REGEXP_LIKE()
REGEXP
RLIKE
Wszystkie są w zasadzie równoważne, ponieważ operatory (dwa drugie) są synonimami funkcji (pierwszy). W każdym razie możesz zobaczyć przykłady wszystkich trzech w akcji poniżej.
REGEXP_LIKE()
Funkcja
Najpierw spójrzmy na funkcję. Oto przykład uruchomienia wyszukiwania wyrażeń regularnych za pomocą REGEXP_LIKE()
funkcja:
SELECT REGEXP_LIKE('Car', '^C') AS 'Match', REGEXP_LIKE('Bar', '^C') AS 'No Match';
Wynik:
+-------+----------+ | Match | No Match | +-------+----------+ | 1 | 0 | +-------+----------+
Pierwszy ciąg pasuje (ponieważ zaczyna się od C ), więc wynik to 1
. Drugi ciąg nie pasuje, więc wynik to 0
.
Jednak ta funkcja może być znacznie bardziej użyteczna niż zwykłe zwracanie 1
lub 0
. Na przykład można go dodać do WHERE
klauzula podczas odpytywania bazy danych. W takim przypadku możemy otrzymać listę wierszy zawierających dopasowanie do wzorca.
Oto przykład:
SELECT AlbumId, AlbumName FROM Albums WHERE REGEXP_LIKE(AlbumName, '^Power');
Wynik:
+---------+------------+ | AlbumId | AlbumName | +---------+------------+ | 1 | Powerslave | | 2 | Powerage | +---------+------------+
Oto pełna tabela:
SELECT AlbumId, AlbumName FROM Albums;
Wynik:
+---------+--------------------------+ | AlbumId | AlbumName | +---------+--------------------------+ | 1 | Powerslave | | 2 | Powerage | | 3 | Singing Down the Lane | | 4 | Ziltoid the Omniscient | | 5 | Casualties of Cool | | 6 | Epicloud | | 7 | Somewhere in Time | | 8 | Piece of Mind | | 9 | Killers | | 10 | No Prayer for the Dying | | 11 | No Sound Without Silence | | 12 | Big Swing Face | | 13 | Blue Night | | 14 | Eternity | | 15 | Scandinavia | | 16 | Long Lost Suitcase | | 17 | Praise and Blame | | 18 | Along Came Jones | | 19 | All Night Wrong | | 20 | The Sixteen Men of Tain | +---------+--------------------------+
REGEXP
Operator
Oto jak zrobić to samo za pomocą REGEXP
operator:
SELECT 'Car' REGEXP '^C' AS 'Match', 'Bar' REGEXP '^C' AS 'No Match';
Wynik:
+-------+----------+ | Match | No Match | +-------+----------+ | 1 | 0 | +-------+----------+
I przykład bazy danych:
SELECT AlbumId, AlbumName FROM Albums WHERE AlbumName REGEXP '^Power';
Wynik:
+---------+------------+ | AlbumId | AlbumName | +---------+------------+ | 1 | Powerslave | | 2 | Powerage | +---------+------------+
Możesz także użyć NOT REGEXP
aby zwrócić odwrotny wynik.
RLIKE
Operator
A tutaj używa RLIKE
:
SELECT 'Car' RLIKE '^C' AS 'Match', 'Bar' RLIKE '^C' AS 'No Match';
Wynik:
+-------+----------+ | Match | No Match | +-------+----------+ | 1 | 0 | +-------+----------+
I przykład bazy danych:
SELECT AlbumId, AlbumName FROM Albums WHERE AlbumName RLIKE '^Power';
Wynik:
+---------+------------+ | AlbumId | AlbumName | +---------+------------+ | 1 | Powerslave | | 2 | Powerage | +---------+------------+
W tym przypadku po prostu zamieniłem REGEXP
dla RLIKE
i zostawił resztę kodu w spokoju.
Możesz także użyć NOT RLIKE
aby zwrócić odwrotny wynik.
Więcej funkcji REGEX
MySQL zawiera również kilka innych funkcji i operatorów wyrażeń regularnych. Poniżej wymieniono trzy z nich. Technicznie rzecz biorąc, możesz również użyć pierwszych dwóch, aby „wykryć”, czy ciąg pasuje do wzorca wyrażenia regularnego (w takim przypadku może ten artykuł powinien być zatytułowany „5 sposobów wykrywania, czy ciąg pasuje do wyrażenia regularnego w MySQL” zamiast po prostu „ 3 sposoby…”).
W każdym razie, oto jeszcze trzy funkcje wyrażeń regularnych:
- Możesz użyć
REGEXP_INSTR()
funkcja zwracająca początkowy indeks podłańcucha, który pasuje do wzorca wyrażenia regularnego. REGEXP_SUBSTR()
funkcja zwraca podciąg pasujący do podanego wzorca wyrażenia regularnego.- I
REGEXP_REPLACE()
funkcja zastępuje wystąpienia podciągu w ciągu, który pasuje do podanego wzorca wyrażenia regularnego.