W MariaDB REGEXP_INSTR()
funkcja zwraca początkowy indeks podłańcucha, który pasuje do wzorca wyrażenia regularnego.
Indeks zaczyna się od 1
. Jeśli nie ma dopasowania, wynikiem jest 0
.
Składnia
Składnia wygląda tak:
REGEXP_INSTR(subject, pattern)
Gdzie subject
jest ciągiem wejściowym i pattern
jest wzorcem wyrażenia regularnego dla podłańcucha.
Zwróć uwagę, że w chwili pisania tego tekstu wersja MariaDB funkcji REGEXP_INSTR()
akceptuje mniej argumentów niż REGEXP_INSTR()
MySQL . Wersja MySQL pozwala na dostarczenie argumentów dla pozycji początkowej wyszukiwania, jakiego wystąpienia szukać, jakiego typu pozycji zwrócić, a także w sposób doprecyzowania wyrażenia regularnego.
Przykład
Oto podstawowy przykład:
SELECT REGEXP_INSTR('Cat', 'at');
Wynik:
+---------------------------+ | REGEXP_INSTR('Cat', 'at') | +---------------------------+ | 2 | +---------------------------+
W tym przypadku występuje dopasowanie, a podciąg zaczyna się na pozycji 2.
Brak dopasowania
Oto przykład, w którym nie ma dopasowania:
SELECT REGEXP_INSTR('Cat', '^at');
Wynik:
+----------------------------+ | REGEXP_INSTR('Cat', '^at') | +----------------------------+ | 0 | +----------------------------+
Brak dopasowania, więc wynik to 0
. Nie ma dopasowania, ponieważ określiłem, że ciąg musi zaczynać się od podciągu.
Zmieńmy to tak, aby działa zacznij od tego podciągu:
SELECT REGEXP_INSTR('at', '^at');
Wynik:
+---------------------------+ | REGEXP_INSTR('at', '^at') | +---------------------------+ | 1 | +---------------------------+
Wrażliwość na wielkość liter
REGEXP_INSTR()
Funkcja jest zgodna z regułami rozróżniania wielkości liter efektywnego sortowania. Dopasowywanie jest wykonywane bez rozróżniania wielkości liter w przypadku sortowania bez rozróżniania wielkości liter oraz z rozróżnianiem wielkości liter w przypadku sortowania z rozróżnianiem wielkości liter i danych binarnych.
Oto przykład:
SELECT
REGEXP_INSTR('Cat', 'c') AS "My Default",
REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_ci, 'c') AS "Case Insensitive",
REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_cs, 'c') AS "Case Sensitive";
Wynik:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | 1 | 1 | 0 | +------------+------------------+----------------+
Moje domyślne sortowanie nie uwzględnia wielkości liter. Pozostałe dwa ciągi zostały zmuszone do sortowania bez rozróżniania wielkości liter i sortowania z rozróżnianiem wielkości liter.
Zapewnienie BINARY
string uwzględnia również wielkość liter (patrz poniżej).
Ciągi binarne
Domyślnie pozycje są mierzone w znakach, a nie w bajtach. Możesz jednak rzutować zestaw znaków wielobajtowych na BINARY
aby uzyskać przesunięcia w bajtach, jeśli zajdzie taka potrzeba.
Przykład:
SELECT
REGEXP_INSTR('© Cat', 'C') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";
Wynik:
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 4 | +-----------+--------+
Symbol praw autorskich używa dwóch bajtów, dlatego w tym przykładzie otrzymujemy wynik 4
podczas przesyłania go do BINARY
, w porównaniu do 3
że otrzymamy inaczej.
Pamiętaj jednak, że przekazywanie BINARY
string wpływa również na rozróżnianie wielkości liter. Z BINARY
ciągi znaków, znak z dużej litery jest inny niż jego odpowiednik z małej litery:
SELECT
REGEXP_INSTR('© Cat', 'c') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";
Wynik:
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 0 | +-----------+--------+
Tutaj szukałem małej litery c
zamiast wielkich liter, a BINARY
ciąg nie pasował.
Argumenty zerowe
Przekazywanie null
ponieważ dowolny argument daje wynik null
:
SELECT
REGEXP_INSTR(null, 'c') AS "1",
REGEXP_INSTR('Cat', null) AS "2",
REGEXP_INSTR(null, null) AS "3";
Wynik:
+------+------+------+ | 1 | 2 | 3 | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Niewłaściwa liczba argumentów
Przekazanie nieprawidłowej liczby argumentów lub brak argumentów skutkuje błędem:
SELECT REGEXP_INSTR('Cat');
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'